C++ MFC深入详解之----模态对话框与非模态对话框
對話框的種類
有兩種類型的對話框:模態(tài)( Modal)對話框和非模態(tài)( Modeless)對話框
- 模態(tài)對話框
模態(tài)對話框是指當其顯示時,程序會暫停執(zhí)行,直到關(guān)閉這個模態(tài)對話框后,才能繼續(xù)執(zhí)行程序中其他任務(wù)。例如,在Word中利用【文件打開】菜單命令顯示一個“打開”對話框后,再用鼠標去選擇其他菜單,或者進行該對話框以外的任何操作時,只會聽到嘟嘟聲,這是因為“打開”對話框是一個模態(tài)對話框。模態(tài)對話框壟斷了用戶的輸入,當模態(tài)對話框打開時,用戶只能與該對話框進行交互,而其他用戶界面對象接收不到輸入信息。我們平時所遇到的大部分對話框都是模態(tài)對話框。
?
- 非模態(tài)對話框
當非模態(tài)對話框顯示時,允許轉(zhuǎn)而執(zhí)行程序中其他任務(wù),而不用關(guān)閉這個對話框。典型的例子是 Windows提供的記事本程序中的“查找”對話框,該對話框不會壟斷用戶的輸入,打開“査找”對話框后,仍可以與其他用戶界面對象進行交互,用戶可以一邊查找,一邊修改文章,這樣,就大大方便了使用
總結(jié):簡單說就是模態(tài)對話框顯示時不能進行其他操作,而非模態(tài)對話框顯示時可以對其他界面進行操作
創(chuàng)建:
首先插入一個對話框:如圖所示點擊插入(Insert),再點擊資源(Resource),選擇Dialog,或者在資源視圖右擊點擊插入(Insert Dialog)
?
在MFC中,對資源的操作通常都是通過一個與資源相芙的類來完成的。對話框資源也有一個相應(yīng)的基類: CDialog.
根據(jù)MSDN提供的幫助信息,可以知道 CDialog類派生于CWnd類,所以它是一個與窗口相關(guān)的類,主要用來在屏幕上顯示一個對話框。由此可知,實際上,對話框本身也是一個窗口界面。既然在MFC中,對資源的操作是通過一個類來完成的,那么就需要創(chuàng)建一個類與這個新建的對話框資源相關(guān)聯(lián)。為此,在ⅤC++開發(fā)環(huán)境中,選擇【view】菜單下的【 Class Wizard】菜單命令,這時會彈出對話框,提示ID: IDD DIALOG1資源是一個新資源,并且因為它是一個對話框資源,所以需要為它創(chuàng)建一個相關(guān)聯(lián)的類,或者可以選擇程序中已有的一個類與之相關(guān)聯(lián)。單擊【OK】按鈕,然后彈出一個對話框利用這個對話框就可以為新建的對話框資源創(chuàng)建一個關(guān)聯(lián)的類,,然后取一個名字,例:CTestDlg.
如何調(diào)用與顯示對話框:
對于模態(tài)對話框:? ? ? 例:點擊按鈕彈出一個模態(tài)對話框
首先拖入按鈕控件,雙擊按鈕,添加響應(yīng)函數(shù),在函數(shù)中敲下如下代碼(在這之前要先添加對應(yīng)對話框類的頭文件TestDlg.h)
void CTestDlg::OnButton1() {// TODO: Add your control notification handler code hereCTestDlg dlg;dlg.DoModal(); }編譯運行:? ?點擊Button1按鈕,顯示為圖二
? ? ??
?
在創(chuàng)建模態(tài)對話框時,當執(zhí)行到調(diào)用 DoModal函數(shù)以顯示這個對話框時,程序就會暫停執(zhí)行,直到模態(tài)對話框關(guān)閉之后,程序才繼續(xù)向下執(zhí)行。也就是說,當模態(tài)對話框顯示時,程序中創(chuàng)建的dlg這個對象的生命周期并未結(jié)束。因此,在創(chuàng)建非模態(tài)對話框時,不能把對話框?qū)ο蠖x為局部對象。對于這個問題,有兩種解決辦法:一種就是把這個對話框?qū)ο蠖x為類的成員變量;另一種方式是將它定義為指針,在堆上分配內(nèi)存。我們知道,在堆上分配的內(nèi)存,與程序的整個生命周期是一致的,當然這里是指程序中不主動銷毀的情況這里,我們采用后一種方式
對于非模態(tài)對話框:? ? ?例:點擊按鈕彈出一個非模態(tài)對話框
void CModleDlg::OnButton1() {// TODO: Add your control notification handler code here // CTestDlg dlg; // dlg.DoModal();CTestDlg* pDlg = new CTestDlg;pDlg->Create(IDD_DIALOG1,this); //創(chuàng)建對話框pDlg->ShowWindow(SW_SHOW); //顯示對話框 }?
可是,上例所示的這段程序仍有問題,首先,我們定義的pDlg這個指針變量是個局部對象,這樣當它的生命周期結(jié)束時,它所保存的內(nèi)存地址就丟失了,那么在程序中也就無法再引用到它所指向的那塊內(nèi)存了。這個問題的解決辦法有兩種:一是將這個指針變量定義為類的成員變量,然后在 CMybole View類的析構(gòu)函數(shù)中調(diào)用 delete函數(shù)來釋放這個指針變量所指向的那塊內(nèi)存;二是在 CTestDlg類中重載PostNcDestroy虛函數(shù),釋放this指針所指向的內(nèi)存。
總結(jié)
以上是生活随笔為你收集整理的C++ MFC深入详解之----模态对话框与非模态对话框的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 学生管理系统---代码实现
- 下一篇: C++项目参考解答-太乐了