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