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

VC++ 專案整合 Splash Screen (啟動畫面) 原理剖析:從 SDI/MDI 到對話方塊應用的完整移植指南

     編輯:關於VC++

Visual C++ AppWizard 內建 Splash Screen 元件 (CSplashWnd),但僅支援 SDI/MDI 專案,對話方塊專案需手動移植。本文深入剖析 CSplashWnd 運作機制 (靜態指標、定時器自毀、訊息轉發),並提供對話方塊專案完整整合步驟。

CSplashWnd 核心原理 (SDI/MDI)

  1. CWinApp::InitInstance 呼叫 CSplashWnd::EnableSplashScreen(TRUE) 設定旗標。
  2. CMainFrame::OnCreate 呼叫 CSplashWnd::ShowSplashScreen(this):
    • 建立 CSplashWnd 物件 (靜態指標 c_pSplashWnd)。
    • 載入位圖資源 IDB_SPLASH,依圖片尺寸 CreateEx 建立 WS_POPUP | WS_VISIBLE 視窗。
    • CenterWindow 置中、SetTimer(1, 750, NULL) 設定 750ms 定時器。
  3. CSplashWnd::OnTimer 觸發 → HideSplashScreen() → DestroyWindow()、AfxGetMainWnd()->UpdateWindow()。
  4. CWinApp::PreTranslateMessage 攔截鍵盤/滑鼠訊息 → CSplashWnd::PreTranslateAppMessage → 若為輸入訊息則提前銷毀 Splash。

對話方塊專案移植步驟

1. 複製檔案

  • 從 SDI 專案複製 Splash.h、Splash.cpp 至對話方塊專案目錄。
  • 專案 → 加入現有項目 → 選取兩檔。

2. 資源準備

  • 資源編輯器新增位圖,ID 設為 IDB_SPLASH。
  • 若需真彩色 (24/32-bit),請用「匯入」方式導入外部 BMP,IDE 雖無法預覽但執行時正常顯示。

3. 修改 CWinApp 衍生類別


BOOL CMyApp::InitInstance() {
  // ...
  CSplashWnd::EnableSplashScreen(TRUE); // 關鍵:啟用旗標
  // ...
  return TRUE;
}

BOOL CMyApp::PreTranslateMessage(MSG* pMsg) {
  if (CSplashWnd::PreTranslateAppMessage(pMsg)) return TRUE;
  return CWinApp::PreTranslateMessage(pMsg);
}

4. 修改 CDialog 衍生類別 (主對話框)

  • ClassWizard 加入 WM_CREATE 處理函式 OnCreate。

int CMyDialog::OnCreate(LPCREATESTRUCT lpCreateStruct) {
  if (CDialog::OnCreate(lpCreateStruct) == -1) return -1;
  CSplashWnd::ShowSplashScreen(this); // this = 對話框視窗作為父視窗
  return 0;
}

5. 標頭檔引入

在 MyApp.cpp、MyDialog.cpp 頂端加入 #include "Splash.h"。

進階客製化

  • 動態文字:在 CSplashWnd::Create 載入位圖後,取得 CDC 繪製使用者名稱、版本號等資訊。
  • 顯示時間:修改 SetTimer(1, 3000, NULL) 延長至 3 秒。
  • 漸變淡入/淡出:覆寫 OnTimer 配合 SetLayeredWindowAttributes (WS_EX_LAYERED) 實現 Alpha 混合動畫。
  • 多執行緒 Splash:若初始化耗時極長,可另闢 UI 執行緒顯示 Splash,主執行緒載入資源,完成後發送訊息關閉 Splash。

常見問題

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
現象原因解決
Splash 不顯示未呼叫 EnableSplashScreen(TRUE) 或 IDB_SPLASH 遺漏檢查資源 ID、InitInstance 順序
閃爍/殘影位圖未含遮罩、背景未正確擦除確保位圖透明色正確、或啟用 WS_EX_LAYERED
對話方塊專案編譯錯誤CSplashWnd 使用 CFrameWnd 專有成員檢查 Splash.cpp 是否有 SDI 專用代碼 (如 m_pMainWnd 轉型)