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

VC++ 四種啟動畫面實作法總覽:從元件庫到對話框移植

     編輯:關於VC++

啟動畫面不僅緩解使用者等待焦慮,更是品牌展示黃金時刻。本文彙整四種 VC++ 實作啟動畫面的方法,涵蓋 SDI/MDI 文檔視圖架構與對話框架構,開發者可依專案類型選擇最適方案。

方法一:使用 MFC 元件庫「Splash Screen」元件 (最快、最標準)

適用:SDI/MDI 文檔視圖專案。

  1. 準備 24-bit BMP 圖片,匯入資源,ID 設為 IDB_SPLASH。
  2. 專案右鍵 → Add to Project → Components and Controls → Visual C++ Components → Splash Screen → Insert。
  3. 確認類別名稱 (預設 CSplashWnd) 與位圖 ID。
  4. 編譯即完成。MFC 會自動在 CWinApp::InitInstance 中建立、顯示、計時關閉。

調整停留時間:修改 CSplashWnd::OnCreate 中 SetTimer(1, 750, NULL) 的第二參數 (毫秒)。

方法二:無模式對話框 + Sleep 阻塞 (簡單直觀)

適用:SDI/MDI 專案,需自行控制顯示邏輯。

  1. 建立對話框資源,加入 Picture Control 顯示 IDB_SPLASH,移除標題列與按鈕 (Styles 取消 Title bar)。
  2. ClassWizard 建立對話框類別 CSplashDlg。
  3. 在 CMainFrame::OnCreate 中建立、顯示、Sleep、銷毀:
#include "SplashDlg.h" int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { CSplashDlg* dlg = new CSplashDlg(this); dlg->Create(CSplashDlg::IDD, this); dlg->ShowWindow(SW_SHOW); dlg->UpdateWindow(); Sleep(2000); // 停留 2 秒 // ... 其他初始化 ... dlg->DestroyWindow(); delete dlg; return 0; }

方法三:無模式對話框 + WM_TIMER 非阻塞 (不凍結主執行緒)

適用:SDI/MDI 專案,啟動過程需同時進行其他初始化。

  1. 同方法二建立 CSplashDlg。
  2. MainFrm.h 宣告 CSplashDlg* m_pSplash;。
  3. CMainFrame::OnCreate 建立計時器與對話框:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { SetTimer(1, 0, NULL); // 立即觸發 WM_TIMER m_pSplash = new CSplashDlg(); m_pSplash->Create(IDD_DIALOG1); m_pSplash->ShowWindow(SW_SHOW); return 0; }
  1. OnTimer 處理顯示與關閉:
void CMainFrame::OnTimer(UINT nIDEvent) { if (m_pSplash->IsWindowVisible()) { m_pSplash->SetActiveWindow(); m_pSplash->UpdateWindow(); Sleep(2000); // 實務上建議改用第二個計時器避免阻塞 m_pSplash->SendMessage(WM_CLOSE); } else { SetActiveWindow(); KillTimer(1); } }

方法四:對話框架構專案移植 Splash Screen 元件 (唯一支援 Dialog-based)

適用:Dialog-based 專案 (無 CMainFrame)。

  1. 依方法一建立 SDI 專案 Splash 產生 Splash1.h/.cpp (CSplashWnd 類別)。
  2. 建立 Dialog-based 專案 Cover。
  3. 複製 Splash1.h/.cpp 至 Cover 專案並加入專案。
  4. 匯入位圖資源 IDB_SPLASH。
  5. 修改 Cover.cpp (CCoverApp::InitInstance):
#include "Splash1.h" BOOL CCoverApp::InitInstance() { CCommandLineInfo cmdInfo; ParseCommandLine(cmdInfo); CSplashWnd::EnableSplashScreen(cmdInfo.m_bShowSplash); // 啟用 // ... 標準初始化 ... return TRUE; }
  1. 在主對話框 CCoverDlg 加入 OnCreate 處理函式 (ClassWizard → WM_CREATE):
#include "Splash1.h" int CCoverDlg::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CDialog::OnCreate(lpCreateStruct) == -1) return -1; CSplashWnd::ShowSplashScreen(this); // 顯示啟動畫面 return 0; }

比較總結表

方法架構支援程式碼量阻塞主執行緒自訂彈性推薦指數
元件庫SDI/MDI極少 (自動產生)否 (內部用 Timer)中★★★★★
無模式 + SleepSDI/MDI少是高★★★☆☆
無模式 + TimerSDI/MDI中否高★★★★☆
Dialog 移植Dialog-based中否高★★★★☆

建議選擇

  • 標準 SDI/MDI 專案 → 方法一 (零成本、標準化)。
  • 需在啟動畫面顯示進度條、版本資訊等動態內容 → 方法三 (非阻塞、可隨時 PostMessage 更新)。
  • Dialog-based 專案 → 方法四 (唯一可行路徑)。

所有範例在 VC6.0 / Windows 2000 測試通過。現代 VS 版本同樣適用,注意字元集設定一致。

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