功能上區別:
模態對話方塊執行時,關閉本對話方塊之前,使用者無法對本程式的其他部分進行操作。
而非模態對話方塊開啟同時還可以切換到其他視窗進行操作。
程式設計實現區別:
模態對話方塊使用cdialog::domodal函式來建立,domodal會啟動乙個模態對話方塊自己的訊息迴圈,這也是模態對話方塊要關閉後才能使用程式其他視窗的原因。domodal函式在對話方塊關閉後才返回。
非模態對話方塊使用cdialog::creat函式實現,由於creat函式不好啟動新的訊息迴圈,對話方塊與應用程式共用乙個訊息迴圈,因此就不好獨佔使用者輸入。
程式設計例項
(1)新建乙個基於對話方塊的mfc應用程式modalmodelesstest,刪除對話方塊中原有控制項。
(2)新增乙個按鈕,標題是「顯示模態對話方塊」。
(3)插入乙個新dialog,把id改為「idd_model」,caption屬性改為「模態對話方塊」,把新建的對話方塊上的控制項都刪除,然後為其新增乙個類「cdlgmodel」,基類選擇「cdialog」。
(4)開啟「idd_modalmodelesstest_dialog」對話方塊,對「顯示模態對話方塊」按鈕雙擊新增訊息處理函式,**如下:
void cmodalmodelesstestdlg::
onbnclickedbutton1()
(5)在modalmodelesstest.cpp的開頭新增包含檔案:
#include
"dlgmodel.h"
(6)儲存工程並執行。
(7)開啟「idd_modalmodelesstest_dialog」對話方塊,新增乙個按鈕,標題是「顯示非模態對話方塊」。
(8)再插入乙個新dialog,把id改為「idd_modeless」,caption屬性改為「非模態對話方塊」,把新建的對話方塊上的控制項都刪除,然後為其新增乙個類「cdlgmodeless」,基類選擇「cdialog」。
(9)在modalmodelesstest.cpp的開頭新增包含檔案:
#include
"dlgmodeless.h"
並定義乙個全域性變數:
cdlgmodeless *g_dlgmodeless =
null
;
(10)開啟「idd_modalmodelesstest_dialog」對話方塊,對「顯示非模態對話方塊」按鈕雙擊新增訊息處理函式,**如下:
void cmodalmodelesstestdlg::
onbnclickedbutton2()
g_dlgmodeless-
>
showwindow
(sw_show)
;//顯示非模態對話方塊
g_dlgmodeless-
>
setactivewindow()
;}
(11)切換到類檢視,右擊cdlgmodeless,選擇屬性,「重寫」onok和oncancel函式,**如下:
void cdlgmodeless::
onok()
void cdlgmodeless::
oncancel()
(12)切換到類檢視,右擊cdlgmodeless,選擇屬性,在訊息頁面中新增「wm_destroy」的響應函式ondestroy,**如下:
void cdlgmodeless::
ondestroy()
(13)在dlgmodeless.cpp的開頭新增全域性變數的引用:
extern cdlgmodeless *g_dlgmodeless;
(14)儲存工程並執行,結果如下圖:
模態對話方塊與非模態對話方塊
1.對話方塊分類 按工作方式不同,可將對話方塊分成兩類 模態對話方塊 modal 在關閉模態對話方塊之前,程式不能進行其他工作 如一般的 開啟檔案 對話方塊 非模態對話方塊 modeless 非模態對話方塊開啟後,程式仍然能夠進行其他工作 如一般的 查詢與替換 對話方塊 2.對話方塊建立 模態對話方...
模態對話方塊與非模態對話方塊
建立對話方塊 case id dialog text dialogbox hinst,makeintresource idd textbox hwnd,textset break 建立模態對話方塊 case id dialog tcolor dhwnd createdialog hinst,make...
模態與非模態對話方塊
vc 模態對話方塊建立 domodal 模式對話方塊關閉順序 1.onclose 訊息響應函式,響應wm close訊息,當 關閉 按鈕被單擊的時候,該函式被呼叫 2.onkillfocus 訊息響應函式,響應wm killfocus訊息,當乙個視窗即將失去鍵盤輸入焦點以前被傳送 3.ondestr...