啟動畫面不僅緩解使用者等待焦慮,更是品牌展示黃金時刻。本文彙整四種 VC++ 實作啟動畫面的方法,涵蓋 SDI/MDI 文檔視圖架構與對話框架構,開發者可依專案類型選擇最適方案。
適用:SDI/MDI 文檔視圖專案。
IDB_SPLASH。CSplashWnd) 與位圖 ID。CWinApp::InitInstance 中建立、顯示、計時關閉。調整停留時間:修改 CSplashWnd::OnCreate 中 SetTimer(1, 750, NULL) 的第二參數 (毫秒)。
適用:SDI/MDI 專案,需自行控制顯示邏輯。
IDB_SPLASH,移除標題列與按鈕 (Styles 取消 Title bar)。CSplashDlg。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;
}
適用:SDI/MDI 專案,啟動過程需同時進行其他初始化。
CSplashDlg。MainFrm.h 宣告 CSplashDlg* m_pSplash;。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;
}
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);
}
}
適用:Dialog-based 專案 (無 CMainFrame)。
Splash 產生 Splash1.h/.cpp (CSplashWnd 類別)。Cover。Splash1.h/.cpp 至 Cover 專案並加入專案。IDB_SPLASH。Cover.cpp (CCoverApp::InitInstance):
#include "Splash1.h"
BOOL CCoverApp::InitInstance()
{
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
CSplashWnd::EnableSplashScreen(cmdInfo.m_bShowSplash); // 啟用
// ... 標準初始化 ...
return TRUE;
}
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) | 中 | ★★★★★ |
| 無模式 + Sleep | SDI/MDI | 少 | 是 | 高 | ★★★☆☆ |
| 無模式 + Timer | SDI/MDI | 中 | 否 | 高 | ★★★★☆ |
| Dialog 移植 | Dialog-based | 中 | 否 | 高 | ★★★★☆ |
PostMessage 更新)。所有範例在 VC6.0 / Windows 2000 測試通過。現代 VS 版本同樣適用,注意字元集設定一致。