詳解vc模態(tài)對(duì)話框和非模態(tài)對(duì)話框

詳解vc模態(tài)對(duì)話框和非模態(tài)對(duì)話框

ID:9092571

大?。?1.00 KB

頁數(shù):3頁

時(shí)間:2018-04-17

詳解vc模態(tài)對(duì)話框和非模態(tài)對(duì)話框_第1頁
詳解vc模態(tài)對(duì)話框和非模態(tài)對(duì)話框_第2頁
詳解vc模態(tài)對(duì)話框和非模態(tài)對(duì)話框_第3頁
資源描述:

《詳解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ù)了。

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動(dòng)畫的文件,查看預(yù)覽時(shí)可能會(huì)顯示錯(cuò)亂或異常,文件下載后無此問題,請(qǐng)放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫負(fù)責(zé)整理代發(fā)布。如果您對(duì)本文檔版權(quán)有爭(zhēng)議請(qǐng)及時(shí)聯(lián)系客服。
3. 下載前請(qǐng)仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進(jìn)行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時(shí)可能由于網(wǎng)絡(luò)波動(dòng)等原因無法下載或下載錯(cuò)誤,付費(fèi)完成后未能成功下載的用戶請(qǐng)聯(lián)系客服處理。