首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

VC++ 啟動畫面製作四大經典方案:從元件庫到無模式對話框完整實現

     編輯:VC 教學

啟動畫面的價值

  • 掩蓋大型程式載入延遲,改善使用者體驗。
  • 展示品牌 Logo、版本號、版權聲明、載入進度。

方案一:MFC Splash Screen 元件(最快、零代碼)

  1. 準備 24/32-bit BMP,資源導入並設 ID 為 IDB_SPLASH。
  2. 專案 → 加入元件 → Visual C++ Components → Splash Screen。
  3. 確認類別名、位圖 ID,完成。
  4. 修改停留時間:CSplashWnd::OnCreate() 中 SetTimer(1, 750, NULL) 第二參數單位毫秒。

優點:自動處理視窗建立、定時銷毀、繪圖。缺點:客製化彈性低(無進度條、動畫)。

方案二:無模式對話框 + Picture Control(高彈性)

  1. 資源新增對話框,類別 CSplashDlg,Style 取消 Title Bar、Border。
  2. 放入 Picture Control,Type=Bitmap,Image=IDB_SPLASH,置中填滿。
  3. 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 執行緒獨立訊息迴圈,主執行緒專注業務初始化。

方案四:基於對話框應用程式專用(無 CMainFrame)

  1. CWinApp::InitInstance() 最前建立 Splash。
  2. 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。
  • 載入進度回呼:Splash 類別暴露 SetProgress(int%),主執行緒定期呼叫。
  • DPI 感知:Manifest 宣告 dpiAware,位圖準備 100%/125%/150% 三套或用向量繪圖。

常見坑與對策

問題原因解決
Splash 閃爍/殘影未 UpdateWindow() 導致 WM_PAINT 排隊建立後立即 UpdateWindow()
主視窗出現前 Splash 已消失Sleep 時間過短或銷毀過早改用事件/訊號同步,而非固定 Sleep
多螢幕位置偏移預設置中於主螢幕用 GetMonitorInfo 計算工作區置中

選擇建議:標準 MFC 文檔/視圖 → 方案一;需進度條/動畫 → 方案三;對話框專案 → 方案四。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved