日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++ MFC深入详解之----模态对话框与非模态对话框

發布時間:2024/1/1 c/c++ 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++ MFC深入详解之----模态对话框与非模态对话框 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

對話框的種類


有兩種類型的對話框:模態( Modal)對話框和非模態( Modeless)對話框

  • 模態對話框

模態對話框是指當其顯示時,程序會暫停執行,直到關閉這個模態對話框后,才能繼續執行程序中其他任務。例如,在Word中利用【文件打開】菜單命令顯示一個“打開”對話框后,再用鼠標去選擇其他菜單,或者進行該對話框以外的任何操作時,只會聽到嘟嘟聲,這是因為“打開”對話框是一個模態對話框。模態對話框壟斷了用戶的輸入,當模態對話框打開時,用戶只能與該對話框進行交互,而其他用戶界面對象接收不到輸入信息。我們平時所遇到的大部分對話框都是模態對話框。

?

  • 非模態對話框

當非模態對話框顯示時,允許轉而執行程序中其他任務,而不用關閉這個對話框。典型的例子是 Windows提供的記事本程序中的“查找”對話框,該對話框不會壟斷用戶的輸入,打開“査找”對話框后,仍可以與其他用戶界面對象進行交互,用戶可以一邊查找,一邊修改文章,這樣,就大大方便了使用

總結:簡單說就是模態對話框顯示時不能進行其他操作,而非模態對話框顯示時可以對其他界面進行操作

創建:

首先插入一個對話框:如圖所示點擊插入(Insert),再點擊資源(Resource),選擇Dialog,或者在資源視圖右擊點擊插入(Insert Dialog)

?

在MFC中,對資源的操作通常都是通過一個與資源相芙的類來完成的。對話框資源也有一個相應的基類: CDialog.

根據MSDN提供的幫助信息,可以知道 CDialog類派生于CWnd類,所以它是一個與窗口相關的類,主要用來在屏幕上顯示一個對話框。由此可知,實際上,對話框本身也是一個窗口界面。既然在MFC中,對資源的操作是通過一個類來完成的,那么就需要創建一個類與這個新建的對話框資源相關聯。為此,在ⅤC++開發環境中,選擇【view】菜單下的【 Class Wizard】菜單命令,這時會彈出對話框,提示ID: IDD DIALOG1資源是一個新資源,并且因為它是一個對話框資源,所以需要為它創建一個相關聯的類,或者可以選擇程序中已有的一個類與之相關聯。單擊【OK】按鈕,然后彈出一個對話框利用這個對話框就可以為新建的對話框資源創建一個關聯的類,,然后取一個名字,例:CTestDlg.

如何調用與顯示對話框:

對于模態對話框:? ? ? 例:點擊按鈕彈出一個模態對話框

首先拖入按鈕控件,雙擊按鈕,添加響應函數,在函數中敲下如下代碼(在這之前要先添加對應對話框類的頭文件TestDlg.h)

void CTestDlg::OnButton1() {// TODO: Add your control notification handler code hereCTestDlg dlg;dlg.DoModal(); }

編譯運行:? ?點擊Button1按鈕,顯示為圖二

? ? ??

?

在創建模態對話框時,當執行到調用 DoModal函數以顯示這個對話框時,程序就會暫停執行,直到模態對話框關閉之后,程序才繼續向下執行。也就是說,當模態對話框顯示時,程序中創建的dlg這個對象的生命周期并未結束。因此,在創建非模態對話框時,不能把對話框對象定義為局部對象。對于這個問題,有兩種解決辦法:一種就是把這個對話框對象定義為類的成員變量;另一種方式是將它定義為指針,在堆上分配內存。我們知道,在堆上分配的內存,與程序的整個生命周期是一致的,當然這里是指程序中不主動銷毀的情況這里,我們采用后一種方式

對于非模態對話框:? ? ?例:點擊按鈕彈出一個非模態對話框

void CModleDlg::OnButton1() {// TODO: Add your control notification handler code here // CTestDlg dlg; // dlg.DoModal();CTestDlg* pDlg = new CTestDlg;pDlg->Create(IDD_DIALOG1,this); //創建對話框pDlg->ShowWindow(SW_SHOW); //顯示對話框 }

?

可是,上例所示的這段程序仍有問題,首先,我們定義的pDlg這個指針變量是個局部對象,這樣當它的生命周期結束時,它所保存的內存地址就丟失了,那么在程序中也就無法再引用到它所指向的那塊內存了。這個問題的解決辦法有兩種:一是將這個指針變量定義為類的成員變量,然后在 CMybole View類的析構函數中調用 delete函數來釋放這個指針變量所指向的那塊內存;二是在 CTestDlg類中重載PostNcDestroy虛函數,釋放this指針所指向的內存。

總結

以上是生活随笔為你收集整理的C++ MFC深入详解之----模态对话框与非模态对话框的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。