




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、模態(tài)對話框和非模態(tài)對話框的區(qū)別假設對話框類名為:CTestDlg 1,如果是模態(tài)對話框: CTestDlg ctd;/創(chuàng)建該對話框對像 ctd.DoModale(); 2,如果是非模態(tài)的: CTestDlg *p_ctd= new CTestDlg();/創(chuàng)建對話框的對像指針 p_ctd->Create(IDD_READING,this);/指針調用Create()函數(shù),ID號為對話框的. p_ctd->ShowWindow(SW_SHOWNA);/()中的參數(shù)可以用來改變對話框的顯示模式(具體參見MSDN中ShowWindow()函數(shù)) 模態(tài)對話框創(chuàng)建后一定要在用戶單擊完對話框上
2、的"確定"或"取消"或"關閉",也就是對它進行了響應并關閉后,程序才能繼續(xù)執(zhí)行. 而非模態(tài)的則是創(chuàng)建完后程序可以繼續(xù)執(zhí)行,對話框可以成為后臺對話框.所以也可以用函數(shù)來關閉 p_ctd->DestroyWindow(); 模態(tài)對話框就是指那種“顯示出來就不可以點選位于其下面的對話框”的對話框;反之的就是非模態(tài)對話框。兩者的區(qū)別:一. 非模態(tài)對話框的模板必須具有Visible風格(Visible=True),否則對話框將不可見,而模態(tài)對話框則無需設置該項風格。在實際編程中更加保險的辦法是調用CWnd:ShowWindow(SW_SH
3、OW)來顯示對話框,而不管對話框是否具有Visible風格。二. 非模態(tài)對話框對象是用new操作符來動態(tài)創(chuàng)建的,而不是以成員變量的形式嵌入到別的對象中或以局部變量的形式構建的。通常應在對話框的擁有者窗口類內(nèi)聲明一個指向對話框類的指針成員變量,通過該指針可訪問對話框對象。三. 通過調用CDialog:Create函數(shù)來啟動對話框,而不是CDialog:DoModal,這是兩者之間區(qū)別的關鍵所在。由于Create函數(shù)不會啟動新的消息循環(huán),對話框與應用程序共用同一個消息循環(huán),這樣對話框就不會壟斷用戶輸入。Create在顯示了對話框后就立即返回,而DoModal是在對話框被關閉后才返回的。由于在Cre
4、ate返回后,不能確定對話框是否已關閉,這樣也就無法確定對話框對象的生存期,因此只好在堆棧中構建對話框對象,而不能以局部變量的形式來構建之。四. 必須調用CWnd:DestroyWindow而不是CDialog:EndDialog來關閉非模態(tài)對話框。調用CWnd:DestroyWindow是直接刪除窗口的一般方法。由于缺省的CDialog:OnOK和CDialog:OnCancel函數(shù)均調用EndDialog,故程序員必須編寫自己的OnOK和OnCancel函數(shù)并且在函數(shù)中調用DestroyWindow來關閉對話框。五. 因為是用new操作符構建非模態(tài)對話框對象,因此必須在對話框關閉后,用de
5、lete操作符刪除對話框對象。在屏幕上一個窗口被刪除后,框架會調用CWnd:PostNcDestroy,這是一個虛擬函數(shù),程序可以在該函數(shù)中完成刪除窗口對象的工作,具體代碼如下void CModelessDialog:PostNcDestroydelete this; /刪除對象這樣,在刪除屏幕上的對話框后,對話框對象將被自動刪除。擁有者就不必顯式地調用delete來刪除對話框對象了。六. 必須有一個標志表明非模態(tài)對話框是否打開的。這樣做的原因是用戶有可能在打開一個模態(tài)對話框的情況下,又一次選擇打開命令。程序根據(jù)標志來決定是打開一個新的對話框,還是僅僅把原來
6、打開的對話框激活。通??梢杂脫碛姓叽翱谥械闹赶驅υ捒驅ο蟮闹羔樧鳛檫@種標志,當對話框關閉時,給該指針賦NULL值,以表明對話框對象已不存在了。例如:創(chuàng)建模態(tài)對話框CTestDlg dlg;dlg.DoModal();創(chuàng)建非模態(tài)對話框CTestDlg * dlg = new CTestDlg;dlg->Create(IDD_TEST_DLG);dlg->ShowWindow(SW_SHOW);使用非模態(tài)對話框與使用模態(tài)對話框相似,但是也有一些重要的區(qū)別:首先,非模態(tài)對話框通常包含一個標題列和一個系統(tǒng)菜單按鈕。當您在Developer Studio中建立對話框時,這些是內(nèi)定選項。用于非
7、模態(tài)對話框的對話框模板中的STYLE敘述形如:STYLE WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE標題列和系統(tǒng)菜單允許使用者,使用鼠標或者鍵盤將非模態(tài)對話框移動到另一個顯示區(qū)域。對于模態(tài)對話框,您通常無須提供標題列和系統(tǒng)菜單,因為使用者不能在其下面的窗口中做任何其它的事情。第二項重要的區(qū)別是:注意,在我們的范例STYLE敘述中包含有WS_VISIBLE樣式。在 Developer Studio中,從Dialog Properties對話框的More Styles頁面卷標中選擇此選項。如果省略了WS_VISIBLE,那么您必須在CreateD
8、ialog呼叫之后呼叫ShowWindow:hDlgModeless = CreateDialog ( . . . ) ;ShowWindow (hDlgModeless, SW_SHOW) ;如果您既沒有包含WS_VISIBLE樣式,又沒有呼叫ShowWindow,那么非模態(tài)對話框將不會被顯示。如果忽略這個事實,那么習慣于模態(tài)對話框的程序寫作者在第一次試圖建立非模態(tài)對話框時,經(jīng)常會出現(xiàn)問題。第三項區(qū)別:與模態(tài)對話框和消息框的消息不同,非模態(tài)對話框的消息要經(jīng)過程序式的消息隊列。要將這些消息傳送給對話框窗口消息處理程序,則必須改變消息隊列。方法如下:當您使用CreateDialog建立非模態(tài)對話
9、框時,應該將從呼叫中傳回的對話框句柄儲存在一個整體變量(如hDlgModeless)中,并將消息循環(huán)改變?yōu)椋簑hile (GetMessage (&msg, NULL, 0, 0) if (hDlgModeless = 0 | !IsDialogMessage (
10、hDlgModeless, &msg) TranslateMessage (&msg) ;
11、0; DispatchMessage (&msg) ; 如果消息是發(fā)送給非模態(tài)對話框的,那么IsDialogMessage將它發(fā)送給對話框中窗口消息處理程序,并傳回TRUE(非0);否則,它將傳回FALSE(0)。只有hDlgModeless為0或者消息不是該對話框的消息時,才必須呼叫TranslateMessage和DispatchMessage函數(shù)。如
12、果您將鍵盤快捷鍵用于您的程序窗口,那么消息循環(huán)將如下所示:while (GetMessage (&msg, NULL, 0, 0) if (hDlgModeless = 0 | !IsDialogMessage (hDlgModeless, &msg) if (!TranslateAccelerator (hwnd, hAccel, &msg
13、)
14、60; TranslateMessage (&msg) ; DispatchMessage (&msg) ; 由于整體變量被初始化為0,所以hDlgModeless將為0,直到建立對話框為止,
15、從而保證不會使用無效的窗口句柄來呼叫IsDialogMessage。在清除非模態(tài)對話框時,您也必須注意這一點,正如最后一點所說明的。hDlgModeless變量也可以由程序的其它部分使用,以便對非模態(tài)對話框是否存在加以驗證。例如,程序中的其它窗口可以在hDlgModeless不等于0時給對話框發(fā)送消息。最后一項重要的區(qū)別:使用DestroyWindow而不是EndDialog來結束非模態(tài)對話框。當您呼叫DestroyWindow后,將hDlgModeless整體變量設定為0。使用者習慣于從系統(tǒng)菜單中選擇Close來結束非模態(tài)對話框。盡管啟用了Close選項,Windows內(nèi)的對話框窗口消息處理
16、程序并不處理WM_CLOSE消息。您必須自己在對話框程序中處理它:case WM_CLOSE : DestroyWindow (hDlg) ; hDlgModeless = NULL ; break ; 注意這兩個窗口句柄
17、之間的區(qū)別:DestroyWindow的hDlg參數(shù)是傳遞給對話框程序的參數(shù);hDlgModeless是從CreateDialog傳回的整體變量,程序在消息循環(huán)內(nèi)檢驗它。您也可以允許使用者使用按鍵來關閉非模態(tài)對話框,處理方式與處理WM_CLOSE消息一樣。對話框必須傳回給建立它的窗口之任何數(shù)據(jù)都可以儲存在整體變量中。如果不喜歡使用整體變量,那么您也可以用CreateDialogParam來建立非模態(tài)對話框,并按前面介紹的方法讓它儲存一個結構指針。vc 模態(tài)和非模態(tài)對話框關閉過程2009-09-16 11:52非模態(tài)對話框相對于模態(tài)對話框,他的創(chuàng)建和銷毀過程和模態(tài)對話框有一定的區(qū)別 先看一下MS
18、DN的原文:When you implement a modeless dialog box, always override the OnCancel member function and call DestroyWindow from within it. Dont call the base class CDialog:OnCancel, because it calls EndDialog, which will make the dialog box invisible but will not destroy it. You should also override PostNc
19、Destroy for modeless dialog boxes in order to delete this, since modeless dialog boxes are usually allocated with new. Modal dialog boxes are usually constructed on the frame and do not need PostNcDestroy cleanup.MS的指示:非模態(tài)對話框需要重載函數(shù)OnCanel,并且在這個函數(shù)中調用DestroyWindow。并且不能調用基類的OnCancel,因為基類的OnCancel調用了End
20、Dialog這個函數(shù),這個函數(shù)是針對模態(tài)對話框的。還有一個必須重載的函數(shù)就是PostNcDestroy,這也是一個虛函數(shù),通常的非模態(tài)對話框是用類的指針,通過new創(chuàng)建的,這就需要在PostNcDestroy函數(shù)中delete掉這個指針。了解了理論過后,下面我們就可以用代碼實現(xiàn)一下非模態(tài)對話框的創(chuàng)建和銷毀過程:/建立/主框架中:CTestDlg *pDlg=new CTestDlg;pDlg->Create(IDD_TESTDLG,this);pDlg->ShowWindow(SW_SHOW);/對話框中:void CTestDlg:OnCancel() DestroyWindow
21、();void CTestDlg:PostNcDestroy() CDialog:PostNcDestroy(); delete this;如果要在點擊按鈕的情況下,銷毀非模態(tài)對話框,只需要把按鈕的事件映射到OnCancel函數(shù)即可。以下是一點資料供參考,非模態(tài)對話框的銷毀順序:MFC應用程序中處理消息的順序1.AfxWndProc() 該函數(shù)負責接收消息,找到消息所屬的CWnd對象,然后調用AfxCallWndProc2.AfxCallWndProc() 該函數(shù)負責保存消息(保存的內(nèi)容主要是消息標識符和消息參數(shù))供應用程序以后使用, 然后調用WindowProc()函數(shù)3.WindowPro
22、c() 該函數(shù)負責發(fā)送消息到OnWndMsg()函數(shù),如果未被處理,則調用DefWindowProc()函數(shù)4.OnWndMsg() 該函數(shù)的功能首先按字節(jié)對消息進行排序,對于WM_COMMAND消息,調用OnCommand()消息 響應函數(shù),對于WM_NOTIFY消息 調用OnNotify()消息響應函數(shù)。任何被遺漏的消息將是一個窗口消息。OnWndMsg()函數(shù)搜 索類的消息映像,以找到一個 能處理任何窗口消息的處理函數(shù)。如果OnWndMsg()函數(shù)不能找到這樣的處理函數(shù)的話,則 把消息返回到WindowProc()函數(shù),由它將消息發(fā)送給DefWindowProc()函數(shù)5.OnComma
23、nd() 該函數(shù)查看這是不是一個控件通知(lParam參數(shù)不為NULL,如果lParam參數(shù)為空的話,說明 該消息不是控件通知),如果它是,OnCommand()函數(shù)會試圖將消息映射到制造通知的控件; 如果他不是一個控件通知(或者如果控件拒絕映射的消息)OnCommand()就會調用OnCmdMsg()函數(shù)6.OnCmdMsg() 根據(jù)接收消息的類,OnCmdMsg()函數(shù)將在一個稱為命令傳遞(Command Routing)的過程中潛在的 傳遞命令消息和控件通知。 例如:如果擁有該窗口的類是一個框架類,則命令和通知消息也被傳遞到視圖和文檔類,并為該 類尋找一個消息處理函數(shù)MFC應用程序創(chuàng)建窗
24、口的過程1.PreCreateWindow() 該函數(shù)是一個重載函數(shù),在窗口被創(chuàng)建前,可以在該重載函數(shù)中改變創(chuàng)建參數(shù) (可以設置窗口風格等等)2.PreSubclassWindow() 這也是一個重載函數(shù),允許首先子分類一個窗口3.OnGetMinMaxInfo() 該函數(shù)為消息響應函數(shù),響應的是WM_GETMINMAXINFO消息,允許設置窗口的最大或者 最小尺寸4.OnNcCreate() 該函數(shù)也是一個消息響應函數(shù),響應WM_NCCREATE消息,發(fā)送消息以告訴窗口的客戶區(qū) 即將被創(chuàng)建5.OnNcCalcSize() 該函數(shù)也是消息響應函數(shù),響應WM_NCCALCSIZE消息,作用是允許
25、改變窗口客戶區(qū)大小6.OnCreate() 該函數(shù)也是一個消息響應函數(shù),響應WM_CREATE消息,發(fā)送消息告訴一個窗口已經(jīng)被創(chuàng)建7.OnSize() 該函數(shù)也是一個消息響應函數(shù),響應WM_SIZE消息,發(fā)送該消息以告訴該窗口大小已經(jīng) 發(fā)生變化8.OnMove() 消息響應函數(shù),響應WM_MOVE消息,發(fā)送此消息說明窗口在移動9.OnChildNotify() 該函數(shù)為重載函數(shù),作為部分消息映射被調用,告訴父窗口即將被告知一個窗口剛剛被 創(chuàng)建MFC應用程序關閉窗口的順序(非模態(tài)窗口)1.OnClose() 消息響應函數(shù),響應窗口的WM_CLOSE消息,當關閉按鈕被單擊的時候發(fā)送此消息2.OnD
26、estroy() 消息響應函數(shù),響應窗口的WM_DESTROY消息,當一個窗口將被銷毀時,發(fā)送此消息3.OnNcDestroy() 消息響應函數(shù),響應窗口的WM_NCDESTROY消息,當一個窗口被銷毀后發(fā)送此消息4.PostNcDestroy() 重載函數(shù),作為處理OnNcDestroy()函數(shù)的最后動作,被CWnd調用MFC應用程序中打開模式對話框的函數(shù)調用順序1.DoModal() 重載函數(shù),重載DoModal()成員函數(shù)2.PreSubclassWindow() 重載函數(shù),允許首先子分類一個窗口3.OnCreate() 消息響應函數(shù),響應WM_CREATE消息,發(fā)送此消息以告訴一個窗口已經(jīng)被創(chuàng)建4.OnSize() 消息響應函數(shù),響應WM_SIZE消息,發(fā)送此消息以告訴窗口大小發(fā)生變化5.OnMove() 消息響應函數(shù),響應WM_MOVE消
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 電力施工承包合同(5篇)
- 口罩銷售的合同(6篇)
- 房地產(chǎn)項目開發(fā)委托代理合同
- 文化旅游產(chǎn)業(yè)推廣與合作經(jīng)營合同
- 房產(chǎn)收購合作協(xié)議書
- 書面貨物運輸合同
- 互聯(lián)網(wǎng)項目合作協(xié)議
- 可再生能源發(fā)電項目合作開發(fā)協(xié)議
- 制式裝修合同
- 房地產(chǎn)項目銷售合同
- 《甲狀旁腺疾病》課件
- 魯教版九年級化學上冊課件【全冊】
- 八年級道德與法治下冊研課標、說教材-陳俊茹課件
- 《城市軌道交通應急處理》課件 《城市軌道交通應急處理》項目二
- 特種行業(yè)許可證變更申請表
- 建筑施工安全風險辨識分級管控指南
- 政務信息工作先進單位事跡材料
- 《觸不可及》影視鑒賞課件
- 冀教版五年級英語下冊教學計劃(精選17篇)
- 外科感染教案
- 《一頁紙項目管理》中文模板
評論
0/150
提交評論