啟動畫面不僅能緩解大型程式載入時的等待枯燥感,更是展示軟體品牌、版本資訊與版權聲明的最佳位置。一個設計精良的啟動畫面能為使用者留下專業的第一印象。
這是 VC++ 提供的現成解決方案,適合單文件應用程式(SDI)。
IDB_SPLASH。CSplashWnd::OnCreate 中的 SetTimer(1, 750, NULL),第二個參數單位為毫秒,預設 750ms。同樣適用於 SDI 專案,自訂對話框外觀更自由。
IDB_SPLASH。CSplashDlg。在對話框放入 Picture 控制項,屬性設為 Bitmap,Image 選擇 IDB_SPLASH。CMainFrame::OnCreate() 中建立、顯示並銷毀對話框:#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();
return 0;
}
改良方法二,避免 Sleep 阻塞主執行緒,使用 WM_TIMER 實現非同步關閉。
CMainFrame 加入 WM_TIMER 訊息處理。MainFrm.h 中宣告 CSplashDlg *Splash; 並包含頭文件。OnTimer 與修改 OnCreate:void CMainFrame::OnTimer(UINT nIDEvent)
{
if (Splash->IsWindowVisible()) {
Splash->SetActiveWindow();
Splash->UpdateWindow();
Sleep(2000); // 可改為 SetTimer 再次觸發
Splash->SendMessage(WM_CLOSE);
} else {
SetActiveWindow();
KillTimer(1);
}
}
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
SetTimer(1, 0, NULL); // 立即觸發
Splash = new CSplashDlg();
Splash->Create(IDD_DIALOG1);
Splash->ShowWindow(SW_SHOW);
return 0;
}
對話框架應用無 CMainFrame,無法直接使用前三法。解決方案:將方法一產生的 Splash1.cpp/h 移植過來。
Splash 產生啟動畫面類別。Cover。Splash1.cpp、Splash1.h 複製到 Cover 專案並加入原始碼/標頭檔。匯入位圖資源 ID 設為 IDB_SPLASH。CCoverApp::InitInstance() 並啟用啟動畫面:#include "Splash1.h"
BOOL CCoverApp::InitInstance()
{
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
CSplashWnd::EnableSplashScreen(cmdInfo.m_bShowSplash);
// ...
}
CCoverDlg 加入 OnCreate 並顯示啟動畫面:#include "Splash1.h"
int CCoverDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
// ...
CSplashWnd::ShowSplashScreen(this);
// ...
}
停留時間修改同方法一,調整 CSplashWnd::OnCreate 中的 SetTimer 參數即可。
四種方法各有適用場景:方法一最簡單快速;方法二、三適合需自訂 UI 的 SDI 應用;方法四解決對話框架應用無法使用啟動畫面的問題。善用啟動畫面能有效提升軟體專業形象與品牌辨識度。