关于模态对话框和非模态对话框的创建、显示,以及和父对话框的传值
當然網上關于這方面的技術博文非常多,此處我只是進行一下小記,再加一點自己的體會,方便以后查詢。
一、模態對話框
1.創建及顯示
模態對話框是一種阻塞式的對話框,即沒有處理完該對話框,不能對其他地方進行操作。比如我自己項目中藥輸入網絡流的播放url的那種對話框。它的創建很簡單。
Curl_File dlg;if (dlg.DoModal()==IDOK){//do something here.}
Curl_File是該模態對話框類,使用前應先使用類向導先創建好。
2.和父對話框傳值
我只寫我自己常用的方法啊。首先在該模態對話框類里面聲明一個成員變量,比如我自己的CString url;再在父對話框中聲明一個變量用來接收它,比如CString myurl;那么傳值就很簡單,直接在上面的代碼if中寫上myurl=dlg.url;就完事。同理,若要是從父對話框傳值到該模態子對話框中,也用同樣的方法。當然也還有其他的方法。
二、非模態對話框
1.創建及顯示
非模態對話框和模態對話框相反,它不是阻塞型的,即你可以同時操作其他的窗口,比如父窗口。相比模態對話框來說,它可能稍微復雜點。一般創建有兩種方法。采用局部變量和成員變量兩種方式。
a.采用局部變量
CTerminal * ptty=new CTerminal(); ptty ->Create(IDD_DIALOGtty, GetDesktopWindow());ptty ->ShowWindow(SW_SHOWNORMAL);
其中第二句ptty ->Create(IDD_DIALOGtty, GetDesktopWindow());可以換成ptty ->Create(IDD_DIALOGtty),如果像我那樣寫的話是可以實現子對話框和父對話框焦點的切換的。用過MFC的人知道,非模態子對話框被彈出后焦點一直在子對話框上,當你點擊父對話框 時,父對話框并不會跑到最上面顯示。所以我要加一個 GetDesktopWindow()。這種方式當然是可以的,由于是局部變量,你會發現當你創建之后,回到父對話框再點擊創建的按鈕,又有一個子對話框被創建出來了,再點擊,又彈出一個,而且我試過,彼此互不影響。原因是什么,就是因為聲明的對話框指針是局部的,并不是全局的。
b.采用成員變量
首先在父對話框類中聲明成員變量CTerminal * ptty;然后在動作按鈕函數中寫:
ptty=new CTerminal(); ptty ->Create(IDD_DIALOGtty, GetDesktopWindow());ptty ->ShowWindow(SW_SHOWNORMAL);
這種方式你就會發現,如果你回到父對話框再次點擊創建按鈕,并沒有新的子對話框被彈出來。即沒有任何反應。原因就是因為對話框指針是父窗口類的成員變量,創建之后一直存在直到父窗口退出。(這里好像不對,我寫完博客后又試了一下,好像也彈出了新的子對話框,具體再研究研究)
2.和父對話框的傳值
由于子對話框類的指針是父類的成員函數,所以由父對話框傳值到子對話框很容易,比如ptty->Str_ip=ip;那么從子對話框傳值到父對話框呢?我看到網上的方法是在子對話框的cpp文件中,獲取父對話框的指針,然后操作。我試了很多次沒有成功,原因是當我使用CMyPlayerDlg *的轉換指針的時候提示沒有聲明CMyPlayerDlg ,那么我之后就在頭文件Terminal.h中包含了父對話框類的頭文件即#include”MyPlayerDlg.h”,然后更是出現了很多的error.可能我的方法不對,或許應該在Terminal.cpp中添加#include”MyPlayerDlg.h”。具體現在我還沒試,因為我后來用了另外一種方法,就沒管了,現在由于已經在寫其他的部分了,現在寫博文只是一種回憶和整理。具體我后面再試試。
那么我的方法是采用全局變量,這里要注意,聲明extern 的時候要在cpp文件中,不要在.h文件中,不信你試試!
3、銷毀
當點擊非模態子對話框的關閉按鈕后,要在父類的析構函數中釋放指針的內存空間(針對成員變量類的).
delete ptty;
此處還有一點,我再下篇博客接著寫。
哎,寫的很慢啊,寫了一個小時了,才這么點。要去寫代碼了,今早必須得完成昨晚那個困擾我的問題了。
拙見,小記!
總結
以上是生活随笔為你收集整理的关于模态对话框和非模态对话框的创建、显示,以及和父对话框的传值的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 由MessageBox和AfxMessa
- 下一篇: 开启一个新的终端并执行特定的命令