IDB_SPLASH。CSplashWnd::OnCreate() 中 SetTimer(1, 750, NULL) 第二參數單位毫秒。優點:自動處理視窗建立、定時銷毀、繪圖。缺點:客製化彈性低(無進度條、動畫)。
CSplashDlg,Style 取消 Title Bar、Border。IDB_SPLASH,置中填滿。CMainFrame::OnCreate() 內建立、顯示、Sleep、銷毀:CSplashDlg *dlg = new CSplashDlg(this);
dlg->Create(CSplashDlg::IDD, this);
dlg->ShowWindow(SW_SHOW);
dlg->UpdateWindow();
Sleep(2000); // 停留 2 秒
// ... 主框架初始化 ...
dlg->DestroyWindow();
優點:可在對話框放進度條、動態文字、GIF 動畫(需額外實現)。缺點:Sleep 阻塞主執行緒,載入邏輯無法並行。
AfxBeginThread() 啟動 UI 執行緒跑 CSplashDlg。PostThreadMessage(WM_QUIT) 關閉 Splash。最佳實務:Splash 執行緒獨立訊息迴圈,主執行緒專注業務初始化。
CWinApp::InitInstance() 最前建立 Splash。DoModal() 前銷毀 Splash,或用無模式 + PumpMessage() 保持繪製。CSplashDlg splash;
splash.Create(IDD_SPLASH);
splash.ShowWindow(SW_SHOW);
splash.UpdateWindow();
// 載入資源...
splash.DestroyWindow();
m_pMainWnd = new CMainDialog;
m_pMainWnd->ShowWindow(SW_SHOW);
WS_EX_LAYERED | WS_EX_TRANSPARENT + SetLayeredWindowAttributes() 配合 Alpha 通道 PNG。SetProgress(int%),主執行緒定期呼叫。dpiAware,位圖準備 100%/125%/150% 三套或用向量繪圖。| 問題 | 原因 | 解決 |
|---|---|---|
| Splash 閃爍/殘影 | 未 UpdateWindow() 導致 WM_PAINT 排隊 | 建立後立即 UpdateWindow() |
| 主視窗出現前 Splash 已消失 | Sleep 時間過短或銷毀過早 | 改用事件/訊號同步,而非固定 Sleep |
| 多螢幕位置偏移 | 預設置中於主螢幕 | 用 GetMonitorInfo 計算工作區置中 |
選擇建議:標準 MFC 文檔/視圖 → 方案一;需進度條/動畫 → 方案三;對話框專案 → 方案四。