利用無邊框對話框 + Picture 控件載入位圖,定時器控制顯示時長,支援點擊/按鍵提前關閉。適用於 VC++.NET (VS2002/2003) MFC 專案,亦可移植至 VC6.0。
MySample。IDD_SPLASH。Border = None、Center = True。IDC_PIC,Type = Bitmap、Center Image = True。CSplash,基類 CDialog。m_pic (CStatic)。OnInitDialog:BOOL CSplash::OnInitDialog()
{
CDialog::OnInitDialog();
// 取得 Picture 客戶區大小
CRect rc; m_pic.GetClientRect(&rc);
// 載入位圖 (支援檔案路徑、資源 ID)
HBITMAP hBmp = (HBITMAP)LoadImage(NULL, _T("splash.bmp"), IMAGE_BITMAP,
rc.Width(), rc.Height(),
LR_LOADFROMFILE | LR_CREATEDIBSECTION);
if (hBmp) m_pic.SetBitmap(hBmp);
// 500ms * 6 = 3 秒自動關閉
SetTimer(1, 500, NULL);
return TRUE;
}
void CSplash::OnTimer(UINT nIDEvent)
{
static int nCount = 0;
if (++nCount > 6) { // 3 秒
KillTimer(1);
OnOK(); // 正常關閉模態對話框
}
CDialog::OnTimer(nIDEvent);
}
在 ClassWizard 為 WM_LBUTTONUP、WM_RBUTTONUP、WM_KEYDOWN (或 WM_CHAR) 添加處理函數,統一執行:
void CSplash::OnAnyUserAction()
{
KillTimer(1);
OnOK();
}
CMySampleApp::InitInstance 中啟動:BOOL CMySampleApp::InitInstance()
{
AfxEnableControlContainer();
// ... 其他初始化 ...
CSplash splash;
splash.DoModal(); // 模態顯示,阻塞直到關閉
// 建立主框架/文檔/視圖 ...
return TRUE;
}
AnimateWindow (Win2000+) 或分層視窗 WS_EX_LAYERED + SetLayeredWindowAttributes 實現 Alpha 淡入淡出。OnTimer 或背景執行緒回呼中更新靜態文字控件顯示初始化進度。LR_CREATEDIBSECTION,並根據 GetDeviceCaps(LOGPIXELSX) 縮放。splash.bmp 放置於執行檔同目錄,或改用資源 ID LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_SPLASH), ...)。Border 必須設為 None,且勿勾選 Title Bar。Create + ShowWindow 並自行管理生命週期。