基於MFC的對話框程序加啓動進度條

最終效果

  1. 開始啓動畫面
    這裏寫圖片描述

  2. 主對話框初始化完成之後(sleep模擬)顯示出主對話框
    這裏寫圖片描述




實現過程

  1. 以前寫的、包括網上很多添加啓動畫面都是阻塞型的,作用只是好看…..
  2. 針對比較大的程序,啓動過程很慢,所以爲了讓用戶等待程序初始化完成,會做出一個初始加載動畫….後臺則在進行主框架的初始化操作…這種添加動畫方式是使用MFC 用戶界面線程實現的..

步驟

參考博客: http://blog.sina.com.cn/s/blog_53061af00100mirh.html
這裏面代碼有點小問題,只能在VC6.0下正常運行,VS2013無法運行,需要修改部分代碼

  1. 打開Visual C++建立一個對話框工程Page
  2. 準備一副位圖資源插入到工程中,作爲啓動時顯示的畫面。
  3. 插入一個對話框控件,設置ID爲IDD_SPLASH。在上面放一個picture控件,類型設爲”Bitmap”,圖象選擇剛纔插入的位圖
  4. 打開 ClassWizard爲此對話框(IDD_SPLASH)建立一個新類CSplashDlg, 基類爲CDialog


  5. 用ClassWizard建立一個由CWinThread派生的類 CSplashThread

  6. 在SplashThread.h 中加入 #include”SplashDlg.h”,並添加指針變量:
    CSplashDlg* m_pSplashDlg; //聲明一個對話框指針
  7. 在CSplashThread 虛函數中添加 InitInstance() 添加以下代碼:

    // TODO:  在此添加專用代碼和/或調用基類
    ::AttachThreadInput(m_nThreadID, AfxGetApp()->m_nThreadID, TRUE);
    //:通常系統內的每個線程都有自己的輸入隊列。本函數允許線程和進程共享輸入隊列。連接了線程後,輸入焦點、窗口激活、鼠標捕獲、鍵盤狀態以及輸入隊列狀態都會進入共享狀態 . (這個函數可以不用)
    m_pSplashDlg = new CSplashDlg;
    //m_pSplashDlg->SetEnable(true);
    m_pSplashDlg->Create(IDD_SPLASH);
    m_pSplashDlg->ShowWindow(SW_SHOW);
    
    
    return TRUE;
    //return CWinThread::InitInstance();
  8. 在CSplashThread類添加一個函數HideSplash(), 用來隱藏啓動畫面(即關閉對話框)

    void CSplashThread::HideSplash()
    {
      m_pSplashDlg->SendMessage(WM_CLOSE);
    }
  9. 在ExitInstance()中添加以下代碼:

    m_pSplashDlg->DestroyWindow();
    delete m_pSplashDlg;
           return CWinThread::ExitInstance();

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

  10. 在應用程序類CPageApp中包含頭文件: #include “SplashThread.h”,添加變量
    CSplashThread* pSplashThread;

  11. 再InitInstance() dlg出現之間位置中添加以下代碼

    pSplashThread = new CSplashThread();
    if (pSplashThread != NULL)
    {
        pSplashThread->CreateThread();
    }
    
    /*不可以這麼寫, VC6.0中可以,但是VS201X以後不可以,返回的是基類的指針,怎麼可以轉換爲 CSplashThread呢???*/
    //pSplashThread = (CSplashThread*)AfxBeginThread(RUNTIME_CLASS(CSplashThread), THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED);
    //ASSERT(pSplashThread->IsKindOf(RUNTIME_CLASS(CSplashThread)));
    //pSplashThread->ResumeThread();
    //Sleep(1);
  12. 在PageDlg的 OnInitDialog() 中添加如下代碼:

    
    Sleep(2000);   //模擬主dlg初始化啓動
    if (((CPageApp*)AfxGetApp())->pSplashThread != NULL)
        ((CPageApp*)AfxGetApp())->pSplashThread->HideSplash();

至此完成使用MFC UI線程實現程序啓動畫面…



Reference

基於MFC的對話框程序加啓動進度條(轉)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章