最終效果
開始啓動畫面
主對話框初始化完成之後(sleep模擬)顯示出主對話框
實現過程
- 以前寫的、包括網上很多添加啓動畫面都是阻塞型的,作用只是好看…..
- 針對比較大的程序,啓動過程很慢,所以爲了讓用戶等待程序初始化完成,會做出一個初始加載動畫….後臺則在進行主框架的初始化操作…這種添加動畫方式是使用MFC 用戶界面線程實現的..
步驟
參考博客: http://blog.sina.com.cn/s/blog_53061af00100mirh.html
這裏面代碼有點小問題,只能在VC6.0下正常運行,VS2013無法運行,需要修改部分代碼
- 打開Visual C++建立一個對話框工程Page
- 準備一副位圖資源插入到工程中,作爲啓動時顯示的畫面。
- 插入一個對話框控件,設置ID爲IDD_SPLASH。在上面放一個picture控件,類型設爲”Bitmap”,圖象選擇剛纔插入的位圖
打開 ClassWizard爲此對話框(IDD_SPLASH)建立一個新類CSplashDlg, 基類爲CDialog
用ClassWizard建立一個由CWinThread派生的類 CSplashThread
- 在SplashThread.h 中加入 #include”SplashDlg.h”,並添加指針變量:
CSplashDlg* m_pSplashDlg; //聲明一個對話框指針 在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();
在CSplashThread類添加一個函數HideSplash(), 用來隱藏啓動畫面(即關閉對話框)
void CSplashThread::HideSplash() { m_pSplashDlg->SendMessage(WM_CLOSE); }
在ExitInstance()中添加以下代碼:
m_pSplashDlg->DestroyWindow(); delete m_pSplashDlg; return CWinThread::ExitInstance();
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~在應用程序類CPageApp中包含頭文件: #include “SplashThread.h”,添加變量
CSplashThread* pSplashThread;再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);
在PageDlg的 OnInitDialog() 中添加如下代碼:
Sleep(2000); //模擬主dlg初始化啓動 if (((CPageApp*)AfxGetApp())->pSplashThread != NULL) ((CPageApp*)AfxGetApp())->pSplashThread->HideSplash();
至此完成使用MFC UI線程實現程序啓動畫面…