AnimateWindowで最小化?した(隠した)ウィンドウの再表示 – プログラミング – Home

AnimateWindowで最小化?し...
 
通知
すべてクリア

AnimateWindowで最小化?した(隠した)ウィンドウの再表示


ときはた
 ときはた
(@ときはた)
ゲスト
結合: 17年前
投稿: 2
Topic starter  

Win32API VC6++ です。
ウィンドウを最小化させるのに、ShowWindowの替わりにAnimateWindowっていう関数で
ちょっとしか効果をつけてみようと思いついて、

AnimateWindow(hwnd, 200, AW_HIDE | AW_VER_POSITIVE);

としてみたのですが、アニメ効果をつけて最小化はできたのですが、最小化されたウィ
ンドウを元に戻そうと、タスクバーのボタン?をクリックしても元に戻ってくれませ
ん。

どうしてなのかさっぱりわかりません。
お願いします。


引用解決済
トピックタグ
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

AW_HIDEだからでは?
通常は、SW_MINIMIZE等で最小化するのであってSW_HIDEで隠す事はしませんし。
AW_HIDEで隠したのであれば、AW_ACTIVATEで表示させるべきではないかと思います。
この場合、「元のサイズに戻す」を乗っ取ってやってAW_ACTIVATEをやら無いと
うまくいかないかもしれませんね。


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

あうあう。
AW_HIDE無しで指定すればいいだけかもしれません。
よく読んでから書き込めばよかった。(^^;


返信引用
subaru
 subaru
(@subaru)
ゲスト
結合: 19年前
投稿: 381
 

AW_HIDEではウインドウが見えなくなるだけで、
タスクバーの最小化メニューの方はまだ有効みたい。
なのでAnimateWindowを呼んだ後に実際に最小化してやればいいのではないかな?


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

なるほど、試してみたら最小化さえしておけば、
あとは再表示処理もしてくれるみたいですね。
こっちの方が簡単ですね。


返信引用
ときはた
 ときはた
(@ときはた)
ゲスト
結合: 17年前
投稿: 2
Topic starter  

subaruさんの方法でうまくいきました。

AnimateWindow(hwnd, 200, AW_HIDE | AW_VER_POSITIVE);
ShowWindow(hwnd, SW_MINIMIZE);

これでアニメーション効果もついて、最小化もできました。
ただ最小化されたウィンドウを元に戻すときは、普通に戻ってしまいます。
これにアニメーション効果をつける方法ってないでしょうか?

WM_LBUTTONDOWN:
if(IsIconic(hwnd))
AnimateWindow(hwnd, 200, AW_ACTIVATE | AW_VER_POSITIVE);
.....
.....
.....
return 0;

こういうごり押しのようなやり方しか思いつかないです。


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

普通に戻ってしまうのは仕方ないですね。
消す時も実際の最小化をしたわけでは無い訳ですし。
実際にはHIDEで消してから最小化していますよね。
戻す時はウインドウズの規定の動作で戻していますから
普通に戻ってしまうのは仕方が無いです。

ごり押しと言うか、戻す時もそうしたいなら
戻すと言う動作を捕まえてAnimateWindowで対応するしか無いと思います。

実験的に戻す時にどんなウインドウメッセージが来ているか調べてみるといいかも
知れませんね。SPY++かなんかで確認できませんでしたっけ?


返信引用
subaru
 subaru
(@subaru)
ゲスト
結合: 19年前
投稿: 381
 

戻す場合はWM_SYSCOMMANDのSC_RESTOREなのですが、どうも一旦最小化してしまうと
ShowWindowなどでは非表示のまま元に戻すことができないようです。

リージョンを設定して無理やり見えなくするとか。
ダサイけどこんなのでもよければ・・・

case WM_SYSCOMMAND:
{
if(wParam == SC_MINIMIZE) {
AnimateWindow(hWnd, 200, AW_HIDE | AW_VER_POSITIVE);
}
else if(wParam == SC_RESTORE && IsIconic(hWnd)) {
RECT rc;
GetWindowRect(hWnd, &rc);
HRGN hRgn = CreateRectRgn(0, 0, rc.right, rc.bottom);
SetWindowRgn(hWnd, hRgn, FALSE);
WINDOWPLACEMENT wp = {0};
wp.length = sizeof(WINDOWPLACEMENT);
GetWindowPlacement(hWnd, &wp);
if(wp.flags == WPF_RESTORETOMAXIMIZED) {
wp.showCmd = SW_MAXIMIZE;
}
else {
wp.showCmd = SW_RESTORE;
}
SetWindowPlacement(hWnd, &wp);
AnimateWindow(hWnd, 0, AW_HIDE | AW_VER_NEGATIVE);
SetWindowRgn(hWnd, NULL, FALSE);
DeleteObject(hRgn);
AnimateWindow(hWnd, 200, AW_VER_NEGATIVE);
return 0;
}
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;

#例外処理は省略


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました