国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C > 正文

MFC創建模態對話框和非模態對話框的方法

2020-01-26 15:27:31
字體:
來源:轉載
供稿:網友

在MFC中對話框有兩種形式,一個是模態對話框(model dialog box),一個是非模態對話框(modeless dialog box)。本文對此分別簡述其創建方法。

一、模態對話框(model dialog box)

在程序運行的過程中,若出現了模態對話框,那么主窗口將無法發送消息,直到模態對話框退出才可以發送。
點擊模態對話框中的OK按鈕,模態對話框會被銷毀。
創建一個模態對話框的代碼如下所示:

//創建一個模態對話框CTestDialog td;td.DoModal(); 

其中CTestDialog為我自己所新建的和一個對話框資源相關聯的對話框類。
可以創建一個布局模態對話框類變量,不用擔心它會隨著所在函數返回而被銷毀。因為DoModal()函數的一個功能是,當前只能運行此模態對話框,且停止主窗口的運行,直到模態對話框退出,才允許主窗口運行
DoModal()函數也有顯示對話框的功能,所以也無需調用其他函數來顯示對話框。

二、非模態對話框(modaless dialog box)

在程序運行的過程中,若出現了非模態對話框,主窗口還可以發送消息。
點擊非模態對話框中的OK按鈕,非模態對話框沒有銷毀,只是隱藏了。若想點擊OK按鈕時,非模態對話框也銷毀,那么CTestDialog類必須重載其基類CDialog的虛函數OnOK(),在此函數里調用DestroyWindow()來銷毀此對話框。

此處采用和上面一樣的方式來創建一個非模態對話框,代碼如下:

CTestDialog td;td.Create(IDD_DIALOG1); //創建一個非模態對話框td.ShowWindow(SW_SHOWNORMAL); //顯示非模態對話框

那么,在運行時,你會發現此對話框無法顯示。這是因為你聲明的對話框變量td是局部變量,但這個函數返回時,td也被析構了,所以無法顯示此對話框。

創建非模態對話框,必須聲明一個指向CTestDialog類的指針變量,且需要顯示的調用ShowWindow()才能將對話框顯示出來。有兩種創建方法:

(1)采用局部變量創建一個非模態對話框

//采用局部變量創建一個非模態對話框CTestDialog *pTD = new CTestDialog();pTD->Create(IDD_DIALOG1); //創建一個非模態對話框pTD->ShowWindow(SW_SHOWNORMAL); //顯示非模態對話框

因為指針在聲明的時候是被放在堆棧中,只有整個應用程序關閉后才會被銷毀,所以可以正常顯示對話框。
這種方法雖然不影響程序的運行,可是指針pTD所指向的內存卻導致不可用,這樣的編程很不好。

(2)采用成員變量創建一個非模態對話框
首先在你所要編寫的類的頭文件中聲明一個指針變量:

private:CTestDialog *pTD;

然后再在相應的CPP文件,在你要創建對話框的位置添加如下代碼:

//采用成員變量創建一個非模態對話框pTD = new CTestDialog(); //給指針分配內存pTD->Create(IDD_DIALOG1); //創建一個非模態對話框pTD->ShowWindow(SW_SHOWNORMAL); //顯示非模態對話框

最后在所在類的析構函數中收回pTD所指向的內存:

delete pTD;
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 赤城县| 桦甸市| 沁水县| 五河县| 津市市| 临夏县| 恩施市| 扬中市| 区。| 余姚市| 察隅县| 连山| 当涂县| 平凉市| 鹰潭市| 扬州市| 荆州市| 冀州市| 建阳市| 高阳县| 松潘县| 霸州市| 衡阳县| 安多县| 新乡市| 敦煌市| 东海县| 株洲县| 甘泉县| 台北市| 长宁区| 姜堰市| 苏尼特右旗| 沁源县| 陆川县| 靖安县| 福鼎市| 平安县| 集安市| 禹州市| 巴里|