想為應用程式加入專業的啟動畫面淡入/淡出效果?無需複雜的雙緩衝或時間軸控制,Windows 2000/XP 以上提供的 AnimateWindow API 一行搞定。本文示範最簡單的整合步驟。
在 stdafx.h 或啟動畫面類別的 .cpp 最頂端 (#include 之前) 加入:
#undef WINVER
#define WINVER 0x0500 // Windows 2000 / XP
#include
WINVER 0x0500 確保標頭檔宣告包含 AnimateWindow。
假設使用無模式對話框或 CWnd 衍生類別作為啟動畫面:
BOOL CSplashWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CWnd::OnCreate(lpCreateStruct) == -1) return -1;
CenterWindow(); // 置中顯示
// 淡入 500ms
AnimateWindow(GetSafeHwnd(), 500, AW_BLEND | AW_ACTIVATE);
// 3 秒後自動關閉
SetTimer(1, 3000, NULL);
return 0;
}
void CSplashWnd::OnClose()
{
// 淡出 500ms
AnimateWindow(GetSafeHwnd(), 500, AW_BLEND | AW_HIDE);
CWnd::OnClose();
}
void CSplashWnd::OnTimer(UINT nIDEvent)
{
if (nIDEvent == 1)
{
KillTimer(1);
PostMessage(WM_CLOSE); // 觸發淡出關閉
}
CWnd::OnTimer(nIDEvent);
}
BOOL CSplashWnd::OnEraseBkgnd(CDC* pDC)
{
// 繪製背景位圖 (資源 IDB_SPLASH)
// 此處假設使用自行封裝的 DDB 類別
DDB mSplashBitmap;
mSplashBitmap.DisplayDDB(pDC, IDB_SPLASH);
return TRUE; // 已處理背景
}
| 旗標 | 效果 |
|---|---|
AW_BLEND | 淡入/淡出 (Alpha 混合),需搭配 AW_ACTIVATE (淡入) 或 AW_HIDE (淡出)。 |
AW_SLIDE | 滑入/滑出,需搭配 AW_HOR_POSITIVE、AW_VER_NEGATIVE 等方向旗標。 |
AW_CENTER | 從中心展開/收縮。 |
BOOL CMyApp::InitInstance()
{
// ... 標準初始化 ...
CSplashWnd* pSplash = new CSplashWnd;
pSplash->CreateEx(WS_EX_TOPMOST | WS_EX_TOOLWINDOW,
AfxRegisterWndClass(0, LoadCursor(NULL, IDC_ARROW)),
_T("Splash"), WS_POPUP | WS_VISIBLE,
0, 0, 400, 300, NULL, NULL);
pSplash->ShowWindow(SW_SHOW);
pSplash->UpdateWindow();
// 主視窗初始化 (耗時操作)...
// ...
// 主視窗準備好後,啟動畫面會自動因 Timer 關閉
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();
return TRUE;
}
AnimateWindow 在遠端桌面 (RDP) 或虛擬機器中可能失效或無動畫;Windows 9x 不支援 (需 WINVER 0x0500)。CMemDC 雙緩衝 + SetLayeredWindowAttributes 手動實作 Alpha 動畫。這是目前 VC++ 實作啟動畫面動畫「投入產出比」最高的方法,強烈建議中小專案優先採用。