MFC創(chuàng)建模態(tài)對(duì)話框和非模態(tài)對(duì)話框的方法
在MFC中對(duì)話框有兩種形式,一個(gè)是模態(tài)對(duì)話框(model dialog box),一個(gè)是非模態(tài)對(duì)話框(modeless dialog box)。本文對(duì)此分別簡(jiǎn)述其創(chuàng)建方法。
一、模態(tài)對(duì)話框(model dialog box)
在程序運(yùn)行的過(guò)程中,若出現(xiàn)了模態(tài)對(duì)話框,那么主窗口將無(wú)法發(fā)送消息,直到模態(tài)對(duì)話框退出才可以發(fā)送。
點(diǎn)擊模態(tài)對(duì)話框中的OK按鈕,模態(tài)對(duì)話框會(huì)被銷毀。
創(chuàng)建一個(gè)模態(tài)對(duì)話框的代碼如下所示:
//創(chuàng)建一個(gè)模態(tài)對(duì)話框 CTestDialog td; td.DoModal();
其中CTestDialog為我自己所新建的和一個(gè)對(duì)話框資源相關(guān)聯(lián)的對(duì)話框類。
可以創(chuàng)建一個(gè)布局模態(tài)對(duì)話框類變量,不用擔(dān)心它會(huì)隨著所在函數(shù)返回而被銷毀。因?yàn)?span style="color: #0000ff">DoModal()函數(shù)的一個(gè)功能是,當(dāng)前只能運(yùn)行此模態(tài)對(duì)話框,且停止主窗口的運(yùn)行,直到模態(tài)對(duì)話框退出,才允許主窗口運(yùn)行。
DoModal()函數(shù)也有顯示對(duì)話框的功能,所以也無(wú)需調(diào)用其他函數(shù)來(lái)顯示對(duì)話框。
二、非模態(tài)對(duì)話框(modaless dialog box)
在程序運(yùn)行的過(guò)程中,若出現(xiàn)了非模態(tài)對(duì)話框,主窗口還可以發(fā)送消息。
點(diǎn)擊非模態(tài)對(duì)話框中的OK按鈕,非模態(tài)對(duì)話框沒(méi)有銷毀,只是隱藏了。若想點(diǎn)擊OK按鈕時(shí),非模態(tài)對(duì)話框也銷毀,那么CTestDialog類必須重載其基類CDialog的虛函數(shù)OnOK(),在此函數(shù)里調(diào)用DestroyWindow()來(lái)銷毀此對(duì)話框。
此處采用和上面一樣的方式來(lái)創(chuàng)建一個(gè)非模態(tài)對(duì)話框,代碼如下:
CTestDialog td; td.Create(IDD_DIALOG1); //創(chuàng)建一個(gè)非模態(tài)對(duì)話框 td.ShowWindow(SW_SHOWNORMAL); //顯示非模態(tài)對(duì)話框
那么,在運(yùn)行時(shí),你會(huì)發(fā)現(xiàn)此對(duì)話框無(wú)法顯示。這是因?yàn)槟懵暶鞯膶?duì)話框變量td是局部變量,但這個(gè)函數(shù)返回時(shí),td也被析構(gòu)了,所以無(wú)法顯示此對(duì)話框。
創(chuàng)建非模態(tài)對(duì)話框,必須聲明一個(gè)指向CTestDialog類的指針變量,且需要顯示的調(diào)用ShowWindow()才能將對(duì)話框顯示出來(lái)。有兩種創(chuàng)建方法:
(1)采用局部變量創(chuàng)建一個(gè)非模態(tài)對(duì)話框
//采用局部變量創(chuàng)建一個(gè)非模態(tài)對(duì)話框 CTestDialog *pTD = new CTestDialog(); pTD->Create(IDD_DIALOG1); //創(chuàng)建一個(gè)非模態(tài)對(duì)話框 pTD->ShowWindow(SW_SHOWNORMAL); //顯示非模態(tài)對(duì)話框
因?yàn)橹羔樤诼暶鞯臅r(shí)候是被放在堆棧中,只有整個(gè)應(yīng)用程序關(guān)閉后才會(huì)被銷毀,所以可以正常顯示對(duì)話框。
這種方法雖然不影響程序的運(yùn)行,可是指針pTD所指向的內(nèi)存卻導(dǎo)致不可用,這樣的編程很不好。
(2)采用成員變量創(chuàng)建一個(gè)非模態(tài)對(duì)話框
首先在你所要編寫的類的頭文件中聲明一個(gè)指針變量:
private: CTestDialog *pTD;
然后再在相應(yīng)的CPP文件,在你要?jiǎng)?chuàng)建對(duì)話框的位置添加如下代碼:
//采用成員變量創(chuàng)建一個(gè)非模態(tài)對(duì)話框 pTD = new CTestDialog(); //給指針?lè)峙鋬?nèi)存 pTD->Create(IDD_DIALOG1); //創(chuàng)建一個(gè)非模態(tài)對(duì)話框 pTD->ShowWindow(SW_SHOWNORMAL); //顯示非模態(tài)對(duì)話框
最后在所在類的析構(gòu)函數(shù)中收回pTD所指向的內(nèi)存:
delete pTD;
相關(guān)文章
C++中的多態(tài)問(wèn)題—理解虛函數(shù)表及多態(tài)實(shí)現(xiàn)原理
這篇文章主要介紹了C++中的多態(tài)問(wèn)題—理解虛函數(shù)表及多態(tài)實(shí)現(xiàn)原理,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02
在Visual Studio Code中配置C++編譯環(huán)境的問(wèn)題
關(guān)于Visual Studio Code對(duì)C++環(huán)境的配置方法應(yīng)該有好多種,我這里用到了其中的兩種,具體內(nèi)容詳情文中給大家詳細(xì)介紹,對(duì)Visual Studio Code配置C++編譯環(huán)境相關(guān)知識(shí)感興趣的朋友一起看看吧2021-07-07
Qt實(shí)現(xiàn)手動(dòng)切換多種布局的完美方案
通過(guò)點(diǎn)擊程序界面上不同的布局按鈕,使主工作區(qū)呈現(xiàn)出不同的頁(yè)面布局,多個(gè)布局之間可以通過(guò)點(diǎn)擊不同布局按鈕切換,支持的最多的窗口為9個(gè),不同布局下窗口數(shù)隨之變化,這篇文章主要介紹了Qt實(shí)現(xiàn)手動(dòng)切換多種布局的完美方案,需要的朋友可以參考下2024-07-07
利用ace的ACE_Task等類實(shí)現(xiàn)線程池的方法詳解
本篇文章是對(duì)利用ace的ACE_Task等類實(shí)現(xiàn)線程池的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
詳解C語(yǔ)言中結(jié)構(gòu)體(struct)的用法
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言中結(jié)構(gòu)體(struct)的用法,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C語(yǔ)言有一定幫助,需要的可以參考一下2022-08-08
c語(yǔ)言如何實(shí)現(xiàn)兩數(shù)之和
這篇文章主要介紹了c語(yǔ)言如何實(shí)現(xiàn)兩數(shù)之和,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07
C++分析類的對(duì)象作類成員調(diào)用構(gòu)造與析構(gòu)函數(shù)及靜態(tài)成員
終于到了對(duì)象的初始化和清理的最后階段了,在這里分享一個(gè)cpp里有多個(gè)類時(shí),一個(gè)類的對(duì)象作為另一個(gè)類成員的時(shí)候構(gòu)造函數(shù)和析構(gòu)函數(shù)調(diào)用的時(shí)機(jī)。還有一個(gè)靜態(tài)成員也是經(jīng)??嫉降狞c(diǎn),在這篇博客將會(huì)詳解其概念并舉出案例鞏固,讓我們開始2022-05-05
C++ OpenCV實(shí)現(xiàn)圖像去水印功能
本文將介紹如何使用OpenCV C++ 進(jìn)行簡(jiǎn)單圖像水印去除。我們?cè)诰W(wǎng)上download圖片時(shí),經(jīng)常因?yàn)榘鏅?quán)問(wèn)題有水印。本案例通過(guò)編寫算法進(jìn)行簡(jiǎn)單水印去除。需要的可以參考一下2022-01-01

