VS2010 MFC 模態對話方塊及其彈出過程

2022-09-02 08:45:08 字數 2470 閱讀 6263

加法計算器對話方塊程式大家照著做一遍後,相信對基於對話方塊的程式有些了解了,有個好的開始對於以後的學習大有裨益。趁熱打鐵,這一節講講什麼是模態對話方塊和非模態對話方塊,以及模態對話方塊怎樣彈出。

一.模態對話方塊和非模態對話方塊

windows對話方塊分為兩類:模態對話方塊和非模態對話方塊。

模態對話方塊是這樣的對話方塊,當它彈出後,本應用程式其他視窗將不再接受使用者輸入,只有該對話方塊響應使用者輸入,在對它進行相應操作退出後,其他視窗才能繼續與使用者互動。

非模態對話方塊則是,它彈出後,本程式其他視窗仍能響應使用者輸入。非模態對話方塊一般用來顯示提示資訊等。

大家對windows系統很了解,相信這兩種對話方塊應該都遇到過。之前的加法計算器對話方塊其實就是模態對話方塊。

二.模態對話方塊是怎樣彈出的

畢竟加法計算器程式大部分都是mfc自動生成的,對話方塊怎麼彈出來的大家可能還不是很清楚。雞啄公尺下面簡單說說它是在**彈出來的,再重新建乙個新的對話方塊並彈出它,這樣大家實踐以後就能更靈活的使用模態對話方塊了。

initinstance()函式的後半部分有一段**就是定義對話方塊物件並彈出對話方塊的,雞啄公尺下面給出這段**並加以注釋:

c++**

cadditiondlg dlg;        // 定義對話方塊類cadditiondlg的物件dlg   

m_pmainwnd = &dlg;       // 將dlg設為主視窗   

int_ptr nresponse = dlg.domodal();   // 彈出對話方塊dlg,並將domodal函式的返回值(退出時點選按鈕的id)賦值給nresponse   

if (nresponse == idok)               // 判斷返回值是否為ok按鈕(其id為idok,這裡已經將它刪除)   

else if (nresponse == idcancel)      // 判斷返回值是否為cancel按鈕(其id為idcancel,已經將它的caption改為了「退出」)   

彈出對話方塊比較關鍵的乙個函式,就是對話方塊類的domodal()函式。cdialog::domodal()函式的原型為:

virtual int_ptr domodal();   

返回值:整數值,指定了傳遞給cdialog::enddialog(該函式用於關閉對話方塊)的nresult引數值。如果函式不能建立對話方塊,則返回-1;如果出現其它錯誤,則返回idabort。

呼叫了它對話方塊就會彈出,返回值是退出對話方塊時所點的按鈕的id,比如,我們點了「退出」按鈕,那麼domodal返回值為idcancel。

三.新增乙個新對話方塊並彈出它

雞啄公尺再為加法計算器程式新增乙個對話方塊,以在計算之前詢問使用者是否確定要進行計算。大家可以完整的看下對話方塊的新增和彈出過程。

1.根據「建立對話方塊模板和修改對話方塊屬性」中所講的方法,在resource view中的「dialog」上點右鍵選擇「insert dialog」,建立乙個新的對話方塊模板,修改其id為idd_tip_dialog,caption改為「提示」,然後參考「為對話方塊新增控制項」中所講,在對話方塊模板上新增乙個靜態文字框(static text),caption改為「您確定要進行加法計算嗎?」,接下來修改ok按鈕的caption為「確定」,cancel按鈕的caption為「取消」,最後調整各個控制項的位置和對話方塊的大小。最終的對話方塊模板如下圖:

2.根據「建立對話方塊類和新增控制項變數」中建立對話方塊類的方法,在對話方塊模板上點右鍵選擇「add class...」,彈出新增類的對話方塊,設定「class name」為ctipdlg,點「ok」。在solution explorer中可以看到生成了ctipdlg類的標頭檔案tipdlg.h和原始檔tipdlg.cpp。

3.我們要在點「計算」按鈕之後彈出此提示對話方塊,那麼就要在「計算」按鈕的訊息處理函式onbnclickedaddbutton()中訪問提示對話方塊類,所以為了訪問ctipdlg類,在additiondlg.cpp中包含ctipdlg的標頭檔案:#include "tipdlg.h"。

4.修改onbnclickedaddbutton()的函式體,在所有**前,構造ctipdlg類的物件tipdlg,並通過語句tipdlg.domodal();彈出對話方塊,最後判斷domodal()函式的返回值是idok還是idcancel來確定是否繼續進行計算。onbnclickedaddbutton()函式修改後如下:

c++**

void cadditiondlg::onbnclickedaddbutton()   

5.測試。編譯執行程式後,在對話方塊上輸入被加數和加數,點「計算」,彈出提示對話方塊詢問是否進行計算,如果選擇「確定」,則提示對話方塊退出,並在主對話方塊上顯示被加數和加數的和,而如果選擇「取消」,則提示對話方塊也會退出,但主對話方塊顯示的和不變,即沒有進行加法計算。

VS2010 MFC 使用模態對話方塊和非模態對話方塊

建立對話方塊之前需要準備好對話方塊資源,並為該對話方塊生成相應的類。比如新建對話方塊資源idd dialog1以及對話方塊類ctips。使用模態對話方塊 在當前呼叫該對話方塊的.cpp中 include tips.h ctips tipsdlg int prr nresponse ipsdlg.do...

VS2010 MFC(對話方塊 訊息對話方塊)

前面幾節講了屬性頁對話方塊,我們可以根據所講內容方便的建立自己的屬性頁對話方塊。本節講解windows系統中最常用最簡單的一類對話方塊 訊息對話方塊。我們在使用windows系統的過程中經常會見到訊息對話方塊,提示我們有異常發生或提出詢問等。因為在軟體開發中經常用到訊息對話方塊,所以mfc提供了兩個...

非模態對話方塊 MFC

cvolsetdlg m pvoldlg null m pvoldlg newcvolsetdlg m pvoldlg create idd dlg vol m pvoldlg showwindow sw show 過載oncancel函式 void cxx oncancel todo add yo...