AnimateWindow (Windows 2000 以上) 提供視窗動畫效果。需定義 WINVER 0x0500 才能使用。
#undef WINVER
#define WINVER 0x0500
#include
BOOL CSplashWnd::OnCreate(LPCREATESTRUCT lpcs) {
CenterWindow(); // 置中顯示
AnimateWindow(GetSafeHwnd(), 500, AW_BLEND); // 0.5 秒淡入
SetTimer(1, 3000, NULL); // 3 秒後自動關閉
return TRUE;
}
void CSplashWnd::OnClose() {
AnimateWindow(GetSafeHwnd(), 500, AW_BLEND | AW_HIDE); // 0.5 秒淡出
CWnd::OnClose();
}
BOOL CSplashWnd::OnEraseBkgnd(CDC* pDC) {
CBitmap bmp;
bmp.LoadBitmap(IDB_SPLASH);
CDC memDC;
memDC.CreateCompatibleDC(pDC);
CBitmap* pOld = memDC.SelectObject(&bmp);
BITMAP bm;
bmp.GetBitmap(&bm);
pDC->BitBlt(0, 0, bm.bmWidth, bm.bmHeight, &memDC, 0, 0, SRCCOPY);
memDC.SelectObject(pOld);
return TRUE;
}
void CSplashWnd::OnTimer(UINT nIDEvent) {
KillTimer(1);
PostMessage(WM_CLOSE, 0, 0);
}
IDB_SPLASH。CWinApp::InitInstance 中建立/顯示 CSplashWnd。Character Set 為 Unicode/MBCS 一致。| 方案 | 優點 | 缺點 |
|---|---|---|
| AnimateWindow | 程式碼極簡、系統級硬體加速、無需手動繪製漸變 | 僅支援簡單淡入/滑入/展開;自訂動畫曲線受限 |
| 手動 Timer + AlphaBlend | 完全控制漸變曲線、支援任意形狀/多層疊加 | 需自行處理 DC、記憶體、效能優化 |
| 分層視窗 (WS_EX_LAYERED) | 支援點擊穿透、任意透明度、抗鋸齒 | Win2k+、紅色通道需預乘 Alpha |
對於簡單啟動畫面,AnimateWindow 是最省時省力的選擇。