Windows 2000+ 內建 AnimateWindow (需 #define WINVER 0x0500) 直接支援視窗動畫:淡入、淡出、滑動、展開、旋轉等,無需手寫計時器/透明度迴圈。
// stdafx.h 或對話方塊 cpp 最頂端,必須在 #include 之前
#undef WINVER
#define WINVER 0x0500 // 啟用 Windows 2000+ API
#include
class CSplashWnd : public CDialog {
public:
CSplashWnd() : CDialog(IDD_SPLASH) {} // 資源編輯器建立無邊框對話方塊 IDD_SPLASH
protected:
virtual BOOL OnInitDialog() override {
CDialog::OnInitDialog();
CenterWindow(); // 置中顯示
// 淡入動畫:500ms
AnimateWindow(GetSafeHwnd(), 500, AW_BLEND | AW_ACTIVATE);
// 3 秒後自動關閉
SetTimer(1, 3000, NULL);
return TRUE;
}
afx_msg void OnTimer(UINT_PTR nIDEvent) {
if (nIDEvent == 1) {
KillTimer(1);
// 淡出動畫:500ms
AnimateWindow(GetSafeHwnd(), 500, AW_BLEND | AW_HIDE);
PostMessage(WM_CLOSE);
}
}
afx_msg BOOL OnEraseBkgnd(CDC* pDC) {
// 繪製背景圖片 (資源 IDB_SPLASH)
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; // 已處理背景,避免閃爍
}
DECLARE_MESSAGE_MAP()
};
BEGIN_MESSAGE_MAP(CSplashWnd, CDialog)
ON_WM_TIMER()
ON_WM_ERASEBKGND()
END_MESSAGE_MAP()
// MyApp.cpp
BOOL CMyApp::InitInstance() {
// ... 早期初始化 ...
// 顯示啟動畫面
CSplashWnd splash;
splash.DoModal(); // 模態顯示,阻塞直到關閉
// ... 主視窗建立 ...
return TRUE;
}
| 旗標 | 效果 | 常用組合 | ||
|---|---|---|---|---|
| AW_BLEND | 淡入/淡出 (Alpha 混合) | 顯示: AW_BLEND | AW_ACTIVATE 隱藏: AW_BLEND | AW_HIDE | ||
| AW_SLIDE | 滑入/滑出 | 需搭配 AW_HOR_POSITIVE/AW_HOR_NEGATIVE/AW_VER_POSITIVE/AW_VER_NEGATIVE | ||
| AW_CENTER | 從中心展開/向中心收縮 | AW_CENTER | AW_ACTIVATE / AW_HIDE | ||
| AW_HIDE | 隱藏動畫 (配合其他旗標) | 必須與 AW_BLEND/AW_SLIDE/AW_CENTER 組合 | ||
| AW_ACTIVATE | 顯示動畫 (預設) | 可省略 |
| 做法 | 代碼量 | 效能 | 視覺品質 | 相容性 |
|---|---|---|---|---|
| AnimateWindow | 極少 (5 行) | 系統級優化 | 平滑、無閃爍 | Win2000+ |
| SetLayeredWindowAttributes + Timer | ~50 行 | 手動迴圈消耗 CPU | 易閃爍、需處理重繪 | Win2000+ |
| GDI+ 漸變繪製 | ~100 行 | CPU 繪圖開銷大 | 可控制最高 | 需 GDI+ 部署 |
一行 AnimateWindow,讓您的啟動畫面瞬間擁有專業級淡入淡出體驗,拒絕繁瑣手工動畫代碼!