資源描述:
《詳解vc模態(tài)對(duì)話框和非模態(tài)對(duì)話框》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在應(yīng)用文檔-天天文庫。
1、詳解VC++模態(tài)對(duì)話框和非模態(tài)對(duì)話框MFC中有兩種類型的對(duì)話框:模態(tài)對(duì)話框和非模態(tài)對(duì)話框。模態(tài)對(duì)話框是指當(dāng)其顯示時(shí),程序會(huì)暫停執(zhí)行,直到關(guān)閉這個(gè)模態(tài)對(duì)話框后,才能繼續(xù)執(zhí)行程序中其他任務(wù)。非模態(tài)對(duì)話框是指當(dāng)其顯示時(shí),允許轉(zhuǎn)而執(zhí)行程序中其他任務(wù),而不用關(guān)閉這個(gè)對(duì)話框。模態(tài)對(duì)話框的創(chuàng)建:創(chuàng)建模態(tài)對(duì)話框需要調(diào)用CDialog類的成員函數(shù):DoModal,該函數(shù)的功能是創(chuàng)建并顯示一個(gè)模態(tài)對(duì)話框,其返回值將作為CDialog類的另一個(gè)成員函數(shù):EndDialog的參數(shù),后者的功能是關(guān)閉模態(tài)對(duì)話框。一般顯示模態(tài)對(duì)話框的實(shí)現(xiàn)代碼如下:voidCASCEView::OnDialog(){CA
2、SCEDlgdlg;dlg.DoModal();}非模態(tài)對(duì)話框的創(chuàng)建:要?jiǎng)?chuàng)建非模態(tài)對(duì)話框就需要利用CDialog類的Create成員函數(shù),該函數(shù)有以下兩種形式的聲明:virtualBOOLCreate(LPCTSTRlpszTemplateName,CWnd*pParentWnd=NULL);virtualBOOLCreate(UINTnIDTemplate,CWnd*pParentWnd=NULL);有上可知,CDialog::Create函數(shù)的第一個(gè)參數(shù)可以是對(duì)話框資源的ID(nIDTemplate),或者也可以是對(duì)話框模板的名稱(lpszTemplateName);而
3、第二個(gè)參數(shù)指定了對(duì)話框的父窗口,如果其值是NULL,則對(duì)話框的父窗口就是主應(yīng)用程序窗口。當(dāng)利用Create函數(shù)創(chuàng)建非模態(tài)對(duì)話框時(shí),我們還需要接著調(diào)用ShowWindow函數(shù)來將這個(gè)對(duì)話框顯示出來;而利用DoModal創(chuàng)建的模態(tài)對(duì)話框之所以不用,是因?yàn)镈oModal函數(shù)本身就有顯示模態(tài)對(duì)話框的作用。同時(shí)我們不能像模態(tài)對(duì)話框那樣將對(duì)話框定義成對(duì)象,如下代碼是顯示不出非模態(tài)對(duì)話框的:voidCASCEView::OnDialog(){CASCEDlgdlg;dlg.Create(IDD_DIALOG1,this);dlg.ShowWindow(SW_SHOW);}因?yàn)檫@里創(chuàng)建的非
4、模態(tài)對(duì)話框?qū)ο骴lg是一個(gè)局部對(duì)象,當(dāng)程序執(zhí)行時(shí),會(huì)依次執(zhí)行各條代碼,當(dāng)OnDialog函數(shù)執(zhí)行結(jié)束時(shí),dlg這個(gè)對(duì)象的生命周期也就玩玩了,它就會(huì)銷毀與之相關(guān)聯(lián)的對(duì)話框資源,對(duì)話框自然就顯示不出來啦!而模態(tài)對(duì)話框之所以能夠顯示,是因?yàn)楫?dāng)執(zhí)行到調(diào)用DoModal函數(shù)以顯示模態(tài)對(duì)話框時(shí),程序就會(huì)暫停執(zhí)行,直到模態(tài)對(duì)話框關(guān)閉之后,程序才繼續(xù)向下執(zhí)行。而這之前,dlg還沒銷毀。因此,在創(chuàng)建非模態(tài)對(duì)話框時(shí),不能將對(duì)話框?qū)ο蠖x成局部變量,解決方法有二:一是把對(duì)話框?qū)ο蠖x成CASCEView類的成員變量;二是把它定義成指針,在堆上分配內(nèi)存,如下:voidCASCEView::OnDi
5、alog(){CASCEDlg*pDlg=newCASCEDlg;pDlg->Create(IDD_DIALOG1,this);pDlg->ShowWindow(SW_SHOW);}但是這又引入了新的問題:我們必須釋放pDlg占用的資源,否則會(huì)造成內(nèi)存泄漏!況且這里pDlg還是一個(gè)局部指針變量,當(dāng)它的生命周期結(jié)束時(shí),在程序中就無法再引用它所指向的那塊內(nèi)存了。解決方法同樣有兩個(gè):一是將pDlg定義成CASCEView類的成員變量,然后在CASCEView類的析構(gòu)函數(shù)中調(diào)用delete函數(shù)釋放它指向的內(nèi)存;二是在CASCEDlg類中重載PostNcDestroy虛函數(shù),釋放th
6、is指針指向的內(nèi)存:voidCASCEDlg::PostNcDestroy(){deletethis;CDialog::PostNcDestroy();}還有一點(diǎn)需要注意的是:當(dāng)單擊對(duì)話框上的默認(rèn)OK按鈕時(shí),兩種對(duì)話框都會(huì)消失。但對(duì)于模態(tài)對(duì)話框而言,此時(shí)對(duì)話框窗口對(duì)象被銷毀了;而對(duì)非模態(tài)對(duì)話框來說,對(duì)話框窗口對(duì)象并未被銷毀,只是隱藏起來而已。在非模態(tài)對(duì)話框中單擊OK按鈕后,程序會(huì)調(diào)用基類CDialog的OnOK函數(shù),這是一個(gè)虛函數(shù),后者又會(huì)調(diào)用EndDialog函數(shù),這個(gè)函數(shù)用于終止模態(tài)對(duì)話框,但對(duì)于非模態(tài)對(duì)話框,這個(gè)函數(shù)只是使對(duì)話框窗口不可見,并不銷毀它。因此,對(duì)非模態(tài)對(duì)
7、話框來說,如果有一個(gè)ID值為IDOK的按鈕,就必須重寫基類的OnOK虛函數(shù),并在重寫的函數(shù)中調(diào)用DestroyWindow函數(shù),以完成銷毀對(duì)話框的工作,同時(shí)注意不要再調(diào)用基類的OnOK函數(shù)。同理,如果非模態(tài)對(duì)話框中有一個(gè)ID值為IDCANCEL的按鈕,也必須重寫基類的OnCancel虛函數(shù),并在重寫的函數(shù)中調(diào)用DestroyWindow函數(shù),銷毀對(duì)話框,同時(shí)注意不要再調(diào)用基類的OnCancel函數(shù)了。