




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、MFC非模態對話框教程MFC非模態對話框教程Tutorial - Modeless Dialogs with MFC開發工具:VC6, VC7, C+, Windows, MFC, VS, VS.NET2002, Dev摘要:文章解釋MFC一些非模式對話框應用的技巧和建議。所含源碼列表:Download Project VC+ .NET - 22 Kb簡介非模式對話框常常感到困惑的新手程序員。基本上是一個非模式對話框是一個使我們能夠互動,與其他的Windows ,甚至當非模式對話框仍然是在屏幕上。如果您請記住,幾個漂亮的小動作,然后編程非模式對話框,將非常簡單。創建非模式對話框簡單的方法創建一
2、個非模式對話框是使用Create( 。通過名稱的對話框中的模板資源和一個可選的CWnd*這點,向父窗口。如果您不通過一個父窗口指針的主要應用程序窗口將被作為父窗口。 Create(將返回true如果調用是成功的。自Create(立即傳回,不像DoModal( , you must never declare your modeless dialog as a local variable與范圍及壽命只有功能函數的地方,這是申明。而不是分配非模式對話框就堆。如果你不這樣做,非模式對話框會被銷毀時刻,你退出功能函數,使你申明它。另一種解決辦法是要申明您的非模
3、式對話框作為一個堆的成員對象你的主要框架窗口或您的CWinApp派生類。一的優勢,用此方法是,你實際上有控件權的非模式對話框,由于你有一個指針。由的方式不同,非模式對話框,非模式對話框需要有WS_VISIBLE風格設置如果你不想讓他們看見后,立即進行創作。否則,你就會有明確要求ShowWindow(與SW_SHOW 。事實上,我建議您這樣做,而不是去所有的地方,改變默認的風格。 CModeLess *m_pmodeless = new CModeLess(this;m_pmodeless->Create(CModeLess:IDD;m_pmodeless->Sh
4、owWindow(SW_SHOW; 父問題慣常的做法是使父窗口的主窗口對您的應用程序,這是典型的主框架窗口。現在的一個問題是與這是因為非模式對話框,將繼續留在上方的這父窗口。它可以讓您的互動與主框架窗口,或許它還包含一個CView得出的視圖。但它可能是惱人的和不可取的有非模式對話框留在頂端。該解決方案在這里是創建非模式對話框作為一個子的桌面上。使用GetDesktopWindow(得到一個指針到桌面上,并通過表示,由于父窗口為非模式對話框,在您的調用Create( 。 m_pmodeless->Create(CModeLess:IDD,GetDesktopW
5、indow(; 銷毀非模式對話框既然我們已分配內存就堆,我們必須將它刪除時,非模式對話框是摧毀,否則我們很快會遇到很大的麻煩與內存泄漏,左,右和中心。當對話框是摧毀了最后一則留言,我們收到處理類是WM_NCDESTROY消息。該OnNcDestroy功能函數是引用,這在原來調用虛擬函數PostNcDestroy 。這正是我們可以delete我們的非模式對話框。 First Call調查的基類的功能函數,以便它是否自己的清理。 void CModeLess:PostNcDestroy( CDialog:PostNcDestroy(;delete this;
6、;問題與成員對象如果非模式對話框是一個成員對象的父窗口的類,我們有一個輕微的問題在這里。成員變量仍持有指針引用,但它引用的記憶已被刪除。有替代這個問題。一種方法是后一用戶定義的消息給父窗口和處理它在父類,通過設置非模式對話框成員變量,以NULL 。另一種方法是使用GetParent(得到父窗口,如有的話,然后在它的實際父類。現在我們已進入到父類的成員變量保存指針向非模式對話框。設置為NULL 。后者的方法是描繪后來我討論如何限制非模式對話框,以一個實例。前者的方法是,如下所示: - void CModeLess:PostNcDestroy( CDialog:Pos
7、tNcDestroy(;GetParent(->PostMessage(WM_MODELESS_CLOSED,0,0;delete this; LRESULT CMainFrame:OnMyMethod(WPARAM wParam, LPARAM lParamm_pmodeless = NULL; return 0; 問題OnOK ( )和OnCancel ( )在模態對話框,每個人都包括女王的廚師,有OK/cancel按鈕。我認為,想必在許多其他更了解市民的意見,您要做好,以避免OK和取消對一非模式對話框。但如果因為某種不可避免的原因,您最希望能有他們對
8、您的非模式對話框,那么您將需要超過預約兩種功能函數。這里是我的非模式版本的OnCancel(功能函數。正如你可以看到,我只是調用的DestroyWindow(和我沒有困擾,調用基類。事實上, don't call the base class at all 。基類函數將拜會EndDialog(這與DoModal( 。 void CModeLess:OnCancel( DestroyWindow(; 好吧,現在我的非模式版本的OnOK( 。我有調用的DestroyWindow( 作為,在OnCancel( ,
9、但也有一些額外的代碼,也正如你所看到的。我調用UpdateData ,因為這是什么OnOK(是否在一個模態對話框。如果DDV宏是成功的驗證,然后UpdateData(true返回我們摧毀的窗口,否則DDV消息框是自動顯示給用戶和我們拒絕銷毀對話框。因此,我們是模擬的行為,一模態對話框的OK按鈕在這里。 void CModeLess:OnOK( if(UpdateData(trueDestroyWindow(; 傳遞回數據在模態對話框,我們仍然可以使用數據變量時, DoModal(返回,因為對話框的對象并沒有被摧毀,但只有基這個的對話框窗口已被摧毀。這是
10、也有可能與非模式對話框,用漂亮的技巧,如下所示。 void CModeLess:OnOK( if(UpdateData(true(CMainFrame*m_parent->m_x=m_sss;DestroyWindow(; 在這里,我已經指派的值對話框的數據變量m_sss到父類的成員變量, m_x 。在這里, m_parent 是一個指針,向父窗口。此處您想知道我得到這個m_parent 從,滾動起來,看看如何我已構造的,我非模式對話框對象。我會重復,單行刷新您的內存,也幫助您避免滾動,從而節省您的一些能源。
11、0;CModeLess *m_pmodeless = new CModeLess(this; 你可以看到,我已通過this向構造。在我而言,這是一個指針,以我的CFrameWnd派生類,其中應用程序向導已命名為CMainFrame我。現在看看我的CModeLess類的構造。 CModeLess:CModeLess(CWnd* pParent /*=NULL*/: CDialog(CModeLess:IDD, pParent/AFX_DATA_INIT(CModeLessm_sss = 0;/AFX_DATA_INITm_parent=pParent; /This is wh
12、ere I point m_parent to my main frame window 這一切,慢慢是有道理的,嗯?跟蹤非模式對話框計數讓我們說你要只有一個實例,該非模式對話框活在同一時間。在這種情況下,每一次用戶啟動一些行動,結果,在使該非模式對話框,你必須檢查,看看是否該非模式對話框是已經在運作中。也就是說, m_pmodeless是非模式對話框的成員,你的類類。在類的構造一套m_pmodeless ,以NULL 。現在您每一次檢查,看看是否m_pmodeless是NULL ,如果這是NULL ,創建一個新的非模式對話框,否則,
13、顯示MessageBox認為,對話框是已經活躍或使用SetForegroundWindow(把非模式對話框到前景.這里是我如何創建我的非模式對話框現在我想限制他們只是一個在時間: - if(m_pmodelessm_pmodeless->SetForegroundWindow(;else m_pmodeless = new CModeLess(this;m_pmodeless->Create(CModeLess:IDD;m_pmodeless->ShowWindow(SW_SHOW; 但是,當對話框被摧毀,我們必須告知父類指針,它現在是無用的。我們做什么,是集指針NULL ,在PostNcDestroy。事實上,這是十分重要的,你這樣做,否則下一次用戶試圖啟動非模式對話框,您的程序會
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025企業單方終止合同補償
- 2025地質勘察合同范本
- 2025委托開發合同范本協議
- 2025技術合作 科技創新與資本對接項目合同
- 2025家居設計代購簡約版合同范本
- 山東省泰安市2025屆高三二輪復習檢測語文試題及參考答案
- 2025年農村房屋買賣合同范本
- 2025供暖設備供應合同(模板)
- 2025年購買二手別墅合同范本
- 2025版權質押合同深度分析
- 項目工作周報模板
- GB4789.2-2022食品安全國家標準 食品微生物學檢驗 菌落總數測定
- DB45∕T 396-2022 膨脹土地區建筑技術規程
- 蘇教版二年級數學下冊《第2單元 練習二》教學課件PPT小學公開課
- 長期購銷合作協議書參考
- 入團志愿書(2016版本)(可編輯打印標準A4) (1)
- 警棍盾牌術基本動作
- 撰寫課題申請書的五個關鍵(課堂PPT)
- 英語作業分層設計案例
- sq1魔方還原教程
- 電腦維修 電腦維修實例大全電子書
評論
0/150
提交評論