ウィンドウのアニメーション
Windows 2000 以降、ウィンドウをアニメーション表示するための API がサポートされている。
アニメーションは見てみないと分かりにくいので、サンプルコードをダウンロードして見ていただきたい。すぐに実行できるよう、今回はバイナリ (exe) も含めている。
サンプルコードのダウンロード [aniwnd.zip, makefile プロジェクト]
このサンプルでは二通りのアニメーションを使う。ひとつは、上図のように下方から上に向かってウィンドウが順に表示されるタイプ。そしてもうひとつは、 ウィンドウが半透明となり消えてゆくタイプである。ウィンドウが消えるデモを見るには、サンプルコードに含まれる animatewnd.exe の画面を左クリックする。
早速、サンプルコードを説明する。WinMain には変わったことは何も無いので省略する。
ウィンドウプロシージャは次の通り。メッ セージクラッカを使っている。ハンドラ名は OnTimer, OnCreate... などのように WM_XYZ を OnXYZ のようにした。
LRESULT CALLBACK WndProc ( HWND
hwnd, UINT Msg, WPARAM wParam, LPARAM lParam) {
switch(Msg) {
HANDLE_MSG (hwnd, WM_TIMER, OnTimer);
HANDLE_MSG (hwnd, WM_CREATE, OnCreate);
HANDLE_MSG (hwnd, WM_DESTROY, OnDestroy);
HANDLE_MSG (hwnd, WM_LBUTTONUP, OnLButtonUp);
}
return DefWindowProc(hwnd, Msg, wParam,
lParam);
}
このサンプルでは、起動直後にウィンドウがアニメーションさせるために OnCreate で AnimateWindow を呼び出している。ウィンドウが下方から上方へスライドするように表示されるようにしているので、AnimateWindow の第三パラメータに AW_VER_NEGATIVE を指定する。
BOOL OnCreate(HWND
hwnd, LPCREATESTRUCT lpCreateStruct) {
AnimateWindow(hwnd,
200, AW_VER_NEGATIVE);
SetForegroundWindow(hwnd);
return TRUE;
}
一つ目のアニメーションはこれだけで終了である。簡単だ。
次にウィンドウがフェードアウトするアニメーションを行う。これも単に、AnimateWindow に AW_HIDE | AW_BLEND を指定して呼び出すだけである。
void OnLButtonUp(HWND hwnd, int x, int y,
UINT keyFlags) {
DWORD dwTime = 500;
SetTimer(hwnd, IDM_LAYERED_TIMER, dwTime
+ 100, NULL);
AnimateWindow(hwnd,
dwTime, AW_HIDE | AW_BLEND);
}
このサンプルコードでは、 メインウィンドウをフェードアウトさせそのままプログラムを終了させているので、タイマーを使って PostQuitMessage を呼び出すタイミングを作っている (そうしないと、ウィンドウが見えなくなるがプロセスが残る)。
void OnTimer(HWND hwnd, UINT id) {
switch (id) {
case IDM_LAYERED_TIMER:
KillTimer
(hwnd, IDM_LAYERED_TIMER);
PostQuitMessage(0);
break;
default:
break;
}
}
AnimateWindow API は使い方が簡単な割りに、ユーザーに対してインパクトがあるので効果的に使いたい。