Win32API VC6++ です。
ウィンドウを最小化させるのに、ShowWindowの替わりにAnimateWindowっていう関数で
ちょっとしか効果をつけてみようと思いついて、
AnimateWindow(hwnd, 200, AW_HIDE | AW_VER_POSITIVE);
としてみたのですが、アニメ効果をつけて最小化はできたのですが、最小化されたウィ
ンドウを元に戻そうと、タスクバーのボタン?をクリックしても元に戻ってくれませ
ん。
どうしてなのかさっぱりわかりません。
お願いします。
AW_HIDEだからでは?
通常は、SW_MINIMIZE等で最小化するのであってSW_HIDEで隠す事はしませんし。
AW_HIDEで隠したのであれば、AW_ACTIVATEで表示させるべきではないかと思います。
この場合、「元のサイズに戻す」を乗っ取ってやってAW_ACTIVATEをやら無いと
うまくいかないかもしれませんね。
あうあう。
AW_HIDE無しで指定すればいいだけかもしれません。
よく読んでから書き込めばよかった。(^^;
AW_HIDEではウインドウが見えなくなるだけで、
タスクバーの最小化メニューの方はまだ有効みたい。
なのでAnimateWindowを呼んだ後に実際に最小化してやればいいのではないかな?
なるほど、試してみたら最小化さえしておけば、
あとは再表示処理もしてくれるみたいですね。
こっちの方が簡単ですね。
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;
こういうごり押しのようなやり方しか思いつかないです。
普通に戻ってしまうのは仕方ないですね。
消す時も実際の最小化をしたわけでは無い訳ですし。
実際にはHIDEで消してから最小化していますよね。
戻す時はウインドウズの規定の動作で戻していますから
普通に戻ってしまうのは仕方が無いです。
ごり押しと言うか、戻す時もそうしたいなら
戻すと言う動作を捕まえてAnimateWindowで対応するしか無いと思います。
実験的に戻す時にどんなウインドウメッセージが来ているか調べてみるといいかも
知れませんね。SPY++かなんかで確認できませんでしたっけ?
戻す場合は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;
#例外処理は省略