基於MFC的對話方塊程式加啟動進度條

2021-05-27 17:52:58 字數 2579 閱讀 9082

對於比較大的程式,在啟動的時候都會顯示乙個畫面,以告訴使用者程式正在載入,或者顯示一些關於軟體的資訊,如visual c++,word, photoshop等。

這些啟動畫面在visual c++中怎麼實現呢?對於文件/檢視結構的程式,可以直接使用vc提供的splashwnd元件。可是在基於對話方塊的程式卻不能使用splashwnd元件。因此只能自己來實現此功能。

因為顯示啟動畫面的同時還要進行程式的載入工作,所以要用到多執行緒。mfc區分了兩種不同型別的多執行緒:使用者介面(ui)執行緒和工作者執行緒。兩者的區別是ui執行緒有訊息迴圈,而工作者執行緒沒有,ui執行緒能夠建立視窗並處理傳送給視窗的訊息。工作者執行緒用來執行後台任務,這些後台任務不直接接受使用者輸入,因此不需要視窗和訊息迴圈。 因為這裡要顯示乙個畫面,所以要使用ui執行緒。

下面結合我做的乙個小軟體「實用鬧鐘」來說明如何為對話方塊程式製作啟動畫面。

開啟visual c++建立乙個對話方塊工程page. 

首先準備一副位圖資源插入到工程中,作為啟動時顯示的畫面。再插入乙個對話方塊,設定id為idd_splash。在上面放乙個picture控制項,型別設為」bitmap」,圖象選擇剛才插入的點陣圖。

設定對話方塊的style為popup,border 為none,去掉title bar屬性,並調整對話方塊的大小與點陣圖等大,這樣對話方塊顯示的時候,你看到的只是。開啟 classwizard為此對話方塊建立乙個新類csplashdlg, 基類為cdialog.

csplashdlg*  m_psplashdlg;  //宣告乙個對話方塊指標

下面我們將在ui執行緒的initinstance()函式中呼叫剛才建立的對話方塊並顯示。

bool csplashthread::initinstance()

//:通常系統內的每個執行緒都有自己的輸入佇列。本函式允許執行緒和程序共享輸入佇列。連線了執行緒後,輸入焦點、視窗啟用、滑鼠捕獲、鍵盤狀態以及輸入佇列狀態都會進入共享狀態 . (這個函式可以不用)

m_psplashdlg=new csplashdlg;   

m_psplashdlg->setenable(true);

m_psplashdlg->create(idd_splash);

m_psplashdlg->showwindow(sw_show);

return true;

為csplashthread類新增乙個函式hidesplash(), 用來隱藏啟動畫面(即關閉對話方塊)

void csplashthread::hidesplash()

m_psplashdlg->sendmessage(wm_close);

在exitinstance()中釋放資源:

int csplashthread::exitinstance()

m_psplashdlg->destroywindow();

delete m_psplashdlg;

return cwinthread::exitinstance();

並新增兩個變數:

public:        //設為pulic型別,是為了在其他類中能夠訪問

csplashthread* psplashthread;

csplashdlg* m_psplashdlg;

在initinstance()中啟動ui執行緒:

psplashthread = (csplashthread*) afxbeginthread(

runtime_class(csplashthread),

thread_priority_normal,

0, create_suspended); 

assert(psplashthread->iskindof(runtime_class(csplashthread)));

psplashthread->resumethread(); 

sleep(1); 

為了讓程式一起動就顯示啟動畫面,這段**應該放在initinstance()最開頭的地方.

啟動畫面是顯示了,可是結束**應該放在什麼地方呢?如果放在initinstance()的cpagedlg dlg; m_pmainwnd = &dlg; 後面,即在構造了主對話方塊之後隱藏啟動畫面, 程式執行時會發現,啟動畫面結束後,還要等一會才能顯示出主對話方塊,這樣就達不到啟動畫面應有的效果. 最好應該在即將顯示主對話方塊的時候隱藏啟動畫面. 我的這個軟體中在主對話方塊中定義了5個子對話方塊類的物件,分別是page1,page2,…page5.

程式啟動時的流程如下:

page1構造 --->page2構造 --->page3構造---> page4構造---> page5構造---> 主對話方塊構造 --->主對話方塊初始化---> page1初始化---> page2初始化 --->page3初始化 page4初始化---> page5初始化

由此可見,啟動畫面結束的最好地方應該是在 page5的初始化函式中

bool cpage5::oninitdialog()

cdialog::oninitdialog();

return true;              

到此,乙個對話方塊程式的啟動畫面就這樣完成了.由於是用對話方塊作為啟動畫面,所以你可以你可以發揮你的想象力,在對話方塊上設計出豐富多才的效果來,比如加上flash,gif動畫等.

基於MFC的對話方塊程式加啟動進度條

對於比較大的程式,在啟動的時候都會顯示乙個畫面,以告訴使用者程式正在載入,或者顯示一些關於軟體的資訊,如visual c word,photoshop等。這些啟動畫面在visual c 中怎麼實現呢?對於文件 檢視結構的程式,可以直接使用vc提供的splashwnd元件。可是在基於對話方塊的程式卻不...

MFC基於對話方塊程式

001 020 else if nresponse idcancel 如果對話方塊是用取消來關閉的,則 021 025 026 由於對話方塊已關閉,所以將返回 false 以便退出應用程式,027 而不是啟動應用程式的訊息幫浦。028 return false 029 因為initinstance ...

MFC 對話方塊程式 模式對話方塊與非模式對話方塊

一 根據主視窗型別,mfc軟體工程可以分為以下幾種架構模型 例如 記事本和畫筆等。2 mdi multiple document inte ce 多文件介面,乙個主框架視窗下可以同時編輯多份文件。例如 vc 6.0,photoshop等軟體。3 基於對話方塊的軟體模型 主視窗是通過資源管理器,在對話...