MFC創(chuàng)建模態(tài)對話框和非模態(tài)對話框的方法
在MFC中對話框有兩種形式,一個是模態(tài)對話框(model dialog box),一個是非模態(tài)對話框(modeless dialog box)。本文對此分別簡述其創(chuàng)建方法。
一、模態(tài)對話框(model dialog box)
在程序運行的過程中,若出現了模態(tài)對話框,那么主窗口將無法發(fā)送消息,直到模態(tài)對話框退出才可以發(fā)送。
點擊模態(tài)對話框中的OK按鈕,模態(tài)對話框會被銷毀。
創(chuàng)建一個模態(tài)對話框的代碼如下所示:
//創(chuàng)建一個模態(tài)對話框 CTestDialog td; td.DoModal();
其中CTestDialog為我自己所新建的和一個對話框資源相關聯的對話框類。
可以創(chuàng)建一個布局模態(tài)對話框類變量,不用擔心它會隨著所在函數返回而被銷毀。因為DoModal()函數的一個功能是,當前只能運行此模態(tài)對話框,且停止主窗口的運行,直到模態(tài)對話框退出,才允許主窗口運行。
DoModal()函數也有顯示對話框的功能,所以也無需調用其他函數來顯示對話框。
二、非模態(tài)對話框(modaless dialog box)
在程序運行的過程中,若出現了非模態(tài)對話框,主窗口還可以發(fā)送消息。
點擊非模態(tài)對話框中的OK按鈕,非模態(tài)對話框沒有銷毀,只是隱藏了。若想點擊OK按鈕時,非模態(tài)對話框也銷毀,那么CTestDialog類必須重載其基類CDialog的虛函數OnOK(),在此函數里調用DestroyWindow()來銷毀此對話框。
此處采用和上面一樣的方式來創(chuàng)建一個非模態(tài)對話框,代碼如下:
CTestDialog td; td.Create(IDD_DIALOG1); //創(chuàng)建一個非模態(tài)對話框 td.ShowWindow(SW_SHOWNORMAL); //顯示非模態(tài)對話框
那么,在運行時,你會發(fā)現此對話框無法顯示。這是因為你聲明的對話框變量td是局部變量,但這個函數返回時,td也被析構了,所以無法顯示此對話框。
創(chuàng)建非模態(tài)對話框,必須聲明一個指向CTestDialog類的指針變量,且需要顯示的調用ShowWindow()才能將對話框顯示出來。有兩種創(chuàng)建方法:
(1)采用局部變量創(chuàng)建一個非模態(tài)對話框
//采用局部變量創(chuàng)建一個非模態(tài)對話框 CTestDialog *pTD = new CTestDialog(); pTD->Create(IDD_DIALOG1); //創(chuàng)建一個非模態(tài)對話框 pTD->ShowWindow(SW_SHOWNORMAL); //顯示非模態(tài)對話框
因為指針在聲明的時候是被放在堆棧中,只有整個應用程序關閉后才會被銷毀,所以可以正常顯示對話框。
這種方法雖然不影響程序的運行,可是指針pTD所指向的內存卻導致不可用,這樣的編程很不好。
(2)采用成員變量創(chuàng)建一個非模態(tài)對話框
首先在你所要編寫的類的頭文件中聲明一個指針變量:
private: CTestDialog *pTD;
然后再在相應的CPP文件,在你要創(chuàng)建對話框的位置添加如下代碼:
//采用成員變量創(chuàng)建一個非模態(tài)對話框 pTD = new CTestDialog(); //給指針分配內存 pTD->Create(IDD_DIALOG1); //創(chuàng)建一個非模態(tài)對話框 pTD->ShowWindow(SW_SHOWNORMAL); //顯示非模態(tài)對話框
最后在所在類的析構函數中收回pTD所指向的內存:
delete pTD;
相關文章
C++中的多態(tài)問題—理解虛函數表及多態(tài)實現原理
這篇文章主要介紹了C++中的多態(tài)問題—理解虛函數表及多態(tài)實現原理,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-02-02
在Visual Studio Code中配置C++編譯環(huán)境的問題
關于Visual Studio Code對C++環(huán)境的配置方法應該有好多種,我這里用到了其中的兩種,具體內容詳情文中給大家詳細介紹,對Visual Studio Code配置C++編譯環(huán)境相關知識感興趣的朋友一起看看吧2021-07-07
C++分析類的對象作類成員調用構造與析構函數及靜態(tài)成員
終于到了對象的初始化和清理的最后階段了,在這里分享一個cpp里有多個類時,一個類的對象作為另一個類成員的時候構造函數和析構函數調用的時機。還有一個靜態(tài)成員也是經??嫉降狞c,在這篇博客將會詳解其概念并舉出案例鞏固,讓我們開始2022-05-05

