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

VC++.NET 製作啟動畫面:無邊框對話框 + 定時器實現

     編輯:VC 教學

設計思路

利用無邊框對話框 + Picture 控件載入位圖,定時器控制顯示時長,支援點擊/按鍵提前關閉。適用於 VC++.NET (VS2002/2003) MFC 專案,亦可移植至 VC6.0。

實現步驟

  1. 建立專案:MFC Application → Dialog based,名稱 MySample。
  2. 設計啟動畫面對話框:
    - 新增對話框資源 IDD_SPLASH。
    - 屬性:Border = None、Center = True。
    - 放置 Picture Control,ID IDC_PIC,Type = Bitmap、Center Image = True。
    - 調整對話框與 Picture 大小一致,無邊框全螢幕或置中。
  3. 建立類別:ClassWizard 對話框雙擊 → 類名 CSplash,基類 CDialog。
    為 Picture Control 添加控制項變數 m_pic (CStatic)。
  4. 重寫 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;
}
  1. 定時器處理:
void CSplash::OnTimer(UINT nIDEvent)
{
    static int nCount = 0;
    if (++nCount > 6) { // 3 秒
        KillTimer(1);
        OnOK(); // 正常關閉模態對話框
    }
    CDialog::OnTimer(nIDEvent);
}
  1. 使用者互動提前關閉:

在 ClassWizard 為 WM_LBUTTONUP、WM_RBUTTONUP、WM_KEYDOWN (或 WM_CHAR) 添加處理函數,統一執行:

void CSplash::OnAnyUserAction()
{
    KillTimer(1);
    OnOK();
}
  1. 在 CMySampleApp::InitInstance 中啟動:
BOOL CMySampleApp::InitInstance()
{
    AfxEnableControlContainer();
    // ... 其他初始化 ...

    CSplash splash;
    splash.DoModal(); // 模態顯示,阻塞直到關閉

    // 建立主框架/文檔/視圖 ...
    return TRUE;
}

進階擴展

  • 漸入/漸出動畫:使用 AnimateWindow (Win2000+) 或分層視窗 WS_EX_LAYERED + SetLayeredWindowAttributes 實現 Alpha 淡入淡出。
  • 版本資訊/載入進度:在 OnTimer 或背景執行緒回呼中更新靜態文字控件顯示初始化進度。
  • 高 DPI 支援:載入位圖時使用 LR_CREATEDIBSECTION,並根據 GetDeviceCaps(LOGPIXELSX) 縮放。

常見問題

  1. 位圖不顯示:確認 splash.bmp 放置於執行檔同目錄,或改用資源 ID LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_SPLASH), ...)。
  2. 對話框有邊框:資源編輯器中 Border 必須設為 None,且勿勾選 Title Bar。
  3. 模態阻塞主視窗建立:此為預期行為;若需非阻塞,改用 Create + ShowWindow 並自行管理生命週期。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved