版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、VC 模式對話框和非模式對話框的創(chuàng)建,銷毀和區(qū)別在WIN32中,模式對話框的創(chuàng)建一般是使用DialogBox來進行創(chuàng)建的。而非模式對話框則是利用CreateWindow來創(chuàng)建的。在MFC或是WTL中,模式對話框一般是使用DoModal,而非模式對話框的創(chuàng)建則是使用Create。模式對話框創(chuàng)建后,程序的其他窗口便不能進行操作,必須將該窗口關閉后,其他窗口才能進行操作。而非模式對話框則無需這樣,它不強制要求用戶立即反應,而是與其他窗口同時接受用戶操作。Create的Dialog一般是modalless,如果你的程序本身就是只有一個Dialog,就無所謂了,看不出modalless的效果。modal
2、less本來就是讓有機會切換到本程序的其他窗口。非模態(tài)對話框的特點:與模態(tài)對話框不同,非模態(tài)對話框不壟斷用戶的輸入,用戶打開非模態(tài)對話框后,仍然可以與其它界面進行交互。非模態(tài)對話框的設計與模態(tài)對話框基本類似,也包括設計對話框模板和設計CDialog類的派生類兩部分。但是,在對話框的創(chuàng)建和刪除過程中,非模態(tài)對話框與模態(tài)對話框相比有下列不同之處:非模態(tài)對話框的模板必須具有Visible風格,否則對話框?qū)⒉豢梢?,而模態(tài)對話框則無需設置該項風格。更保險的辦法是調(diào)用CWnd:ShowWindow(SW_SHOW)來顯示對話框,而不管對話框是否具有Visible風格。非模態(tài)對話框?qū)ο笫怯胣ew操作符在堆中
3、動態(tài)創(chuàng)建的,而不是以成員變量的形式嵌入到別的對象中或以局部變量的形式構建在堆棧上。通常應在對話框的擁有者窗口類內(nèi)聲明一個指向?qū)υ捒蝾惖闹羔槼蓡T變量,通過該指針可訪問對話框?qū)ο?。通過調(diào)用CDialog:Create函數(shù)來啟動對話框,而不是CDialog:DoModal,這是模態(tài)對話框的關鍵所在。由于Create函數(shù)不會啟動新的消息循環(huán),對話框與應用程序共用同一個消息循環(huán),這樣對話框就不會壟斷用戶的輸入。Create在顯示了對話框后就立即返回,而DoModal是在對話框被關閉后才返回的。眾所周知,在MFC程序中,窗口對象的生存期應長于對應的窗口,也就是說,不能在未關閉屏幕上窗口的情況下先把對應的窗
4、口對象刪除掉。由于在Create返回后,不能確定對話框是否已關閉,這樣也就無法確定對話框?qū)ο蟮纳嫫?,因此只好在堆中構建對話框?qū)ο螅荒芤跃植孔兞康男问絹順嫿ㄖ?。必須調(diào)用CWnd:DestroyWindow而不是CDialog:EndDialog來關閉非模態(tài)對話框。調(diào)用CWnd:DestroyWindow是直接刪除窗口的一般方法。由于缺省的CDialog:OnOK和CDialog:OnCancel函數(shù)均調(diào)用EndDialog,故程序員必須編寫自己的OnOK和OnCancel函數(shù)并且在函數(shù)中調(diào)用DestroyWindow來關閉對話框。因為是用new操作符構建非模態(tài)對話框?qū)ο?,因此必須在對話框關
5、閉后,用delete操作符刪除對話框?qū)ο蟆T谄聊簧弦粋€窗口被刪除后,框架會調(diào)用CWnd:PostNcDestroy,這是一個虛擬函數(shù),程序可以在該函數(shù)中完成刪除窗口對象的工作,具體代碼如下void CModelessDialog:PostNcDestroy delete this; /刪除對象本身這樣,在刪除屏幕上的對話框后,對話框?qū)ο髮⒈蛔詣觿h除。擁有者對象就不必顯式的調(diào)用delete來刪除對話框?qū)ο罅?。必須有一個標志表明非模態(tài)對話框是否是打開的。這樣做的原因是用戶有可能在打開一個模態(tài)對話框的情況下,又一次選擇打開命令。程序根據(jù)標志來決定是打開一個新的對話框,還是僅僅把原來打開的對話框激活。
6、通??梢杂脫碛姓叽翱谥械闹赶?qū)υ捒驅(qū)ο蟮闹羔樧鳛檫@種標志,當對話框關閉時,給該指針賦NULL值,以表明對話框?qū)ο笠巡淮嬖诹?。提示:在C+編程中,判斷一個位于堆中的對象是否存在的常用方法是判斷指向該對象的指針是否為空。這種機制要求程序員將指向該對象的指針初始化為NULL值,在創(chuàng)建對象時將返回的地址賦給該指針,而在刪除對象時將該指針置成NULL值。根據(jù)上面的分析,我們很容易把Register程序中的登錄數(shù)據(jù)對話框改成非模態(tài)對話框。這樣做的好處在于如果用戶在輸入數(shù)據(jù)時發(fā)現(xiàn)編輯視圖中有錯誤的數(shù)據(jù),那么不必關閉對話框,就可以在編輯視圖中進行修改。窗口對象的自動清除:一個MFC窗口對象包括兩方面的內(nèi)容:一
7、是窗口對象封裝的窗口,即存放在m_hWnd成員中的HWND(窗口句柄),二是窗口對象本身是一個C+對象。要刪除一個MFC窗口對象,應該先刪除窗口對象封裝的窗口,然后刪除窗口對象本身。刪除窗口最直接方法是調(diào)用CWnd:DestroyWindow或:DestroyWindow,前者封裝了后者的功能。前者不僅會調(diào)用后者,而且會使成員m_hWnd保存的HWND無效(NULL)。如果DestroyWindow刪除的是一個父窗口或擁有者窗口,則該函數(shù)會先自動刪除所有的子窗口或被擁有者,然后再刪除父窗口或擁有者。在一般情況下,在程序中不必直接調(diào)用DestroyWindow來刪除窗口,因為MFC會自動調(diào)用De
8、stroyWindow來刪除窗口。例如,當用戶退出應用程序時,會產(chǎn)生WM_CLOSE消息,該消息會導致MFC自動調(diào)用CWnd:DestroyWindow來刪除主框架窗口,當用戶在對話框內(nèi)按了OK或Cancel按鈕時,MFC會自動調(diào)用CWnd:DestroyWindow來刪除對話框及其控件。窗口對象本身的刪除則根據(jù)對象創(chuàng)建方式的不同,分為兩種情況。在MFC編程中,會使用大量的窗口對象,有些窗口對象以變量的形式嵌入在別的對象內(nèi)或以局部變量的形式創(chuàng)建在堆棧上,有些則用new操作符創(chuàng)建在堆中。對于一個以變量形式創(chuàng)建的窗口對象,程序員不必關心它的刪除問題,因為該對象的生命期總是有限的,若該對象是某個對象
9、的成員變量,它會隨著父對象的消失而消失,若該對象是一個局部變量,那么它會在函數(shù)返回時被清除。對于一個在堆中動態(tài)創(chuàng)建的窗口對象,其生命期卻是任意長的。初學者在學習C+編程時,對new操作符的使用往往不太踏實,因為用new在堆中創(chuàng)建對象,就不能忘記用delete刪除對象。讀者在學習MFC的例程時,可能會產(chǎn)生這樣的疑問,為什么有些程序用new創(chuàng)建了一個窗口對象,卻未顯式的用delete來刪除它呢?問題的答案就是有些MFC窗口對象具有自動清除的功能。如前面講述非模態(tài)對話框時所提到的,當調(diào)用CWnd:DestroyWindow或:DestroyWindow刪除一個窗口時,被刪除窗口的PostNcDest
10、roy成員函數(shù)會被調(diào)用。缺省的PostNcDestroy什么也不干,但有些MFC窗口類會覆蓋該函數(shù)并在新版本的PostNcDestroy中調(diào)用delete this來刪除對象,從而具有了自動清除的功能。此類窗口對象通常是用new操作符創(chuàng)建在堆中的,但程序員不必操心用delete操作符去刪除它們,因為一旦調(diào)用DestroyWindow刪除窗口,對應的窗口對象也會緊接著被刪除。不具有自動清除功能的窗口類如下所示。這些窗口對象通常是以變量的形式創(chuàng)建的,無需自動清除功能。所有標準的Windows控件類。從CWnd類直接派生出來的子窗口對象(如用戶定制的控件)。切分窗口類CSplitterWnd。缺省的
11、控制條類(包括工具條、狀態(tài)條和對話條)。模態(tài)對話框類。具有自動清除功能的窗口類如下所示,這些窗口對象通常是在堆中創(chuàng)建的。主框架窗口類(直接或間接從CFrameWnd類派生)。視圖類(直接或間接從CView類派生)。讀者在設計自己的派生窗口類時,可根據(jù)窗口對象的創(chuàng)建方法來決定是否將窗口類設計成可以自動清除的。例如,對于一個非模態(tài)對話框來說,其對象是創(chuàng)建在堆中的,因此應該具有自動清除功能。綜上所述,對于MFC窗口類及其派生類來說,在程序中一般不必顯式刪除窗口對象。也就是說,既不必調(diào)用DestroyWindow來刪除窗口對象封裝的窗口,也不必顯式地用delete操作符來刪除窗口對象本身。只要保證非自
12、動清除的窗口對象是以變量的形式創(chuàng)建的,自動清除的窗口對象是在堆中創(chuàng)建的,MFC的運行機制就可以保證窗口對象的徹底刪除。如果需要手工刪除窗口對象,則應該先調(diào)用相應的函數(shù)(CWnd:DestroyWindow)刪除窗口,然后再刪除窗口對象對于以變量形式創(chuàng)建的窗口對象,窗口對象的刪除是框架自動完成的對于在堆中動態(tài)創(chuàng)建了的非自動清除的窗口對象,必須在窗口被刪除后,顯式地調(diào)用delete來刪除對象(一般在擁有者或父窗口的析構函數(shù)中進行)對于具有自動清除功能的窗口對象,只需調(diào)用CWnd:DestroyWindow即可刪除窗口和窗口對象。注意,對于在堆中創(chuàng)建的窗口對象,不要在窗口還未關閉的情況下就用dele
13、te操作符來刪除窗口對象提示:在非模態(tài)對話框的OnCancel函數(shù)中可以不調(diào)用CWnd:DestroyWindow,取而代之的是調(diào)用CWnd:ShowWindow(SW_HIDE)來隱藏對話框在下次打開對話框時就不必調(diào)用Create了,只需調(diào)用CWnd:ShowWindow(SW_SHOW)來顯示對話框這樣做的好處在于對話框中的數(shù)據(jù)可以保存下來,供以后使用由于擁有者窗口在被關閉時會調(diào)用DestroyWindow刪除每一個所屬窗口,故只要非模態(tài)對話框是自動清除的,程序員就不必擔心對話框?qū)ο蟮膭h除問題以下是一點資料供參考,非模態(tài)對話框的銷毀順序:MFC應用程序中處理消息的順序1.AfxWndPro
14、c() 該函數(shù)負責接收消息,找到消息所屬的CWnd對象,然后調(diào)用AfxCallWndProc2.AfxCallWndProc() 該函數(shù)負責保存消息(保存的內(nèi)容主要是消息標識符和消息參數(shù))供應用程序以后使用,然后調(diào)用WindowProc()函數(shù)3.WindowProc() 該函數(shù)負責發(fā)送消息到OnWndMsg()函數(shù),如果未被處理,則調(diào)用DefWindowProc()函數(shù)4.OnWndMsg() 該函數(shù)的功能首先按字節(jié)對消息進行排序,對于WM_COMMAND消息,調(diào)用OnCommand()消息響應函數(shù),對于WM_NOTIFY消息調(diào)用OnNotify()消息響應函數(shù)。任何被遺漏的消息將是一個窗口
15、消息。OnWndMsg()函數(shù)搜索類的消息映像,以找到一個能處理任何窗口消息的處理函數(shù)。如果OnWndMsg()函數(shù)不能找到這樣的處理函數(shù)的話,則把消息返回到WindowProc()函數(shù),由它將消息發(fā)送給DefWindowProc()函數(shù)5.OnCommand() 該函數(shù)查看這是不是一個控件通知(lParam參數(shù)不為NULL,如果lParam參數(shù)為空的話,說明該消息不是控件通知),如果它是,OnCommand()函數(shù)會試圖將消息映射到制造通知的控件;如果他不是一個控件通知(或者如果控件拒絕映射的消息)OnCommand()就會調(diào)用OnCmdMsg()函數(shù)6.OnCmdMsg() 根據(jù)接收消息的
16、類,OnCmdMsg()函數(shù)將在一個稱為命令傳遞(Command Routing)的過程中潛在的傳遞命令消息和控件通知。例如:如果擁有該窗口的類是一個框架類,則命令和通知消息也被傳遞到視圖和文檔類,并為該類尋找一個消息處理函數(shù)MFC應用程序創(chuàng)建窗口的過程1.PreCreateWindow() 該函數(shù)是一個重載函數(shù),在窗口被創(chuàng)建前,可以在該重載函數(shù)中改變創(chuàng)建參數(shù)(可以設置窗口風格等等)2.PreSubclassWindow() 這也是一個重載函數(shù),允許首先子分類一個窗口3.OnGetMinMaxInfo() 該函數(shù)為消息響應函數(shù),響應的是WM_GETMINMAXINFO消息,允許設置窗口的最大或
17、者最小尺寸4.OnNcCreate() 該函數(shù)也是一個消息響應函數(shù),響應WM_NCCreate消息,發(fā)送消息以告訴窗口的客戶區(qū)即將被創(chuàng)建5.OnNcCalcSize() 該函數(shù)也是消息響應函數(shù),響應WM_NCCALCSIZE消息,作用是允許改變窗口客戶區(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()
18、 該函數(shù)為重載函數(shù),作為部分消息映射被調(diào)用,告訴父窗口即將被告知一個窗口剛剛被創(chuàng)建MFC應用程序關閉窗口的順序(非模態(tài)窗口)1.OnClose() 消息響應函數(shù),響應窗口的WM_CLOSE消息,當關閉按鈕被單擊的時候發(fā)送此消息2.OnDestroy() 消息響應函數(shù),響應窗口的WM_DESTROY消息,當一個窗口將被銷毀時,發(fā)送此消息3.OnNcDestroy() 消息響應函數(shù),響應窗口的WM_NCDESTROY消息,當一個窗口被銷毀后發(fā)送此消息4.PostNcDestroy() 重載函數(shù),作為處理OnNcDestroy()函數(shù)的最后動作,被CWnd調(diào)用MFC應用程序中打開模式對話框的函數(shù)調(diào)用
19、順序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消息,發(fā)送此消息,以告訴窗口正在移動6.OnSetFont() 消息響應函數(shù),響應WM_SETFONT消息,發(fā)送此消息,以允許改變對話框中控件的字體7.OnInitDialog() 消息響應函數(shù),響應WM_I
20、NITDIALOG消息,發(fā)送此消息以允許初始化對話框中的控件,或者是創(chuàng)建新控件8.OnShowWindow() 消息響應函數(shù),響應WM_SHOWWINDOW消息,該函數(shù)被ShowWindow()函數(shù)調(diào)用9.OnCtlColor() 消息響應函數(shù),響應WM_CTLCOLOR消息,被父窗口發(fā)送已改變對話框或?qū)υ捒蛏厦婵丶念伾?0. OnChildNotify() 重載函數(shù),作為WM_CTLCOLOR消息的結果發(fā)送MFC應用程序中關閉模式對話框的順序1.OnClose() 消息響應函數(shù),響應WM_CLOSE消息,當"關閉"按鈕被單擊的時候,該函數(shù)被調(diào)用2.OnKillFocus
21、() 消息響應函數(shù),響應WM_KILLFOCUS消息,當一個窗口即將失去鍵盤輸入焦點以前被發(fā)送3.OnDestroy() 消息響應函數(shù),響應WM_DESTROY消息,當一個窗口即將被銷毀時,被發(fā)送4.OnNcDestroy() 消息響應函數(shù),響應WM_NCDESTROY消息,當一個窗口被銷毀以后被發(fā)送5.PostNcDestroy() 重載函數(shù),作為處理OnNcDestroy()函數(shù)的最后動作被CWnd調(diào)用打開無模式對話框的順序1.PreSubclassWindow() 重載函數(shù),允許用戶首先子分類一個窗口2.OnCreate() 消息響應函數(shù),響應WM_Create消息,發(fā)送此消息以告訴一個
22、窗口已經(jīng)被創(chuàng)建3.OnSize() 消息響應函數(shù),響應WM_SIZE消息,發(fā)送此消息以告訴窗口大小發(fā)生變化4.OnMove() 消息響應函數(shù),響應WM_MOVE消息,發(fā)送此消息以告訴窗口正在移動5.OnSetFont() 消息響應函數(shù),響應WM_SETFONT消息,發(fā)送此消息以允許改變對話框中控件的字體MSDN.原文說明:CWnd:DestroyWindow See AlsoCWnd Overview | Class Members | Hierarchy Chart | CWnd:OnDestroy | CWnd:Detach | DestroyWindowDestroys the Wind
23、ows window attached to the CWnd object.virtual BOOL DestroyWindow( );Return ValueNonzero if the window is destroyed; otherwise 0.RemarksThe DestroyWindow member function sends appropriate messages to the window to deactivate it and remove the input focus. It also destroys the window's menu, flus
24、hes the application queue, destroys outstanding timers, removes Clipboard ownership, and breaks the Clipboard-viewer chain if CWnd is at the top of the viewer chain. It sends WM_DESTROY and WM_NCDESTROY messages to the window. It does not destroy the CWnd object.DestroyWindow is a place holder for p
25、erforming cleanup. Because DestroyWindow is a virtual function, it is shown in any CWnd-derived class in Class View. But even if you override this function in your CWnd-derived class, DestroyWindow is not necessarily called. If DestroyWindow is not called in the MFC code, then you have to explicitly
26、 call it in your own code if you want it to be called.Assume, for example, you have overridden DestroyWindow in a CView-derived class. Since MFC source code does not call DestroyWindow in any of its CFrameWnd-derived classes, your overridden DestroyWindow will not be called unless you call it explic
27、itly. If the window is the parent of any windows, these child windows are automatically destroyed when the parent window is destroyed. The DestroyWindow member function destroys child windows first and then the window itself. The DestroyWindow member function also destroys modeless dialog boxes crea
28、ted by CDialog:Create.If the CWnd being destroyed is a child window and does not have the WS_EX_NOPARENTNOTIFY style set, then the WM_PARENTNOTIFY message is sent to the parent.Example/ CModeless is CDialog class representing a modeless dialog/ Destruction of the modeless dialog involves calling Des
29、troyWindow in / OnOK() & OnCancel() handlersvoid CModeless:OnOK() if (!UpdateData(TRUE) TRACE0("UpdateData failed during dialog termination/n"); / The UpdateData routine will set focus to correct item return; DestroyWindow();void CModeless:OnCancel() DestroyWindow();非模態(tài)對話框相對于模態(tài)對話框,他的創(chuàng)建
30、和銷毀過程和模態(tài)對話框有一定的區(qū)別 先看一下MSDN的原文: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. Yo
31、u should also override PostNcDestroy 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ù)中調(diào)用DestroyWindow。并且不能調(diào)用基類
32、的OnCancel,因為基類的OnCancel調(diào)用了EndDialog這個函數(shù),這個函數(shù)是針對模態(tài)對話框的。還有一個必須重載的函數(shù)就是PostNcDestroy,這也是一個虛函數(shù),通常的非模態(tài)對話框是用類的指針,通過new創(chuàng)建的,這就需要在PostNcDestroy函數(shù)中delete掉這個指針。模式對話框會和非模式對話框在運行原理上有一定的差別。下面是創(chuàng)建模式對話框和非模式對話框的幾段代碼,可以比較其中的不同之處:void CMainWindow:OnModel() / 用戶點擊“Model Dialog”按鈕 CMyDialog dlg(this); / 顯示模式對話框 dlg.DoModa
33、l();void CMainWindow:OnModeless() / 用戶點擊“Modeless Dialo”按鈕 CMyDialog* pDlg = new CMyDialog(this); pDlg->m_bModeless = TRUE; / 創(chuàng)建無模式對話框 pDlg->Create(IDD_MYDIALOG); / 移動窗口到主窗口的中央 pDlg->CenterWindow(); / 顯示更新窗口 pDlg->ShowWindow(SW_NORMAL); pDlg->UpdateWindow();void CMyDialog:OnCancel() /
34、 用戶關閉對話框 if(m_bModeless) DestroyWindow(); else CDialog:OnCancel(); void CMyDialog:PostNcDestroy() if(m_bModeless) /這么做可以使模式對話框不調(diào)用PostNcDestroy,因為它的實例會自動刪除 delete this;其中OnModel是對彈出模式對話框的按鈕的函數(shù)響應,OnModeless是對彈出非模式對話框的按鈕的函數(shù)響應,從代碼可以看到兩者創(chuàng)建的方法不一樣。由于創(chuàng)建模式對話框的方法比較簡潔,可想而知,CMyDialog類默認是創(chuàng)建模式對話框的。再來看下面兩個CMyDialo
35、g重載的函數(shù)OnCancel和PostNcDestroy,為什么要重載這兩個函數(shù)呢?這得從兩種對話框的運行原理來分析。模式對話框在關閉之前不允許用戶切換到主窗口。模式對話框使得消息循環(huán)限制在對話框內(nèi),而不會流向主窗口,所以對主窗口的任何操作都是無效的。這樣就類似于在主窗口消息循環(huán)里內(nèi)嵌了一個屬于對話框的消息循環(huán)(不知道這樣的描述是否恰當),有點函數(shù)機制的味道。事實上,模式對話框?qū)嵗▽ο螅┚褪窃诤瘮?shù)堆棧中申請的,這樣在對話框窗口銷毀時就用不著刪除自己了。因為函數(shù)機制的作用本身就是這樣的。下面來澄清一下對話框窗口銷毀和對話框?qū)嵗N毀的區(qū)別。一個對話框如果要銷毀,要做兩個步驟,先是要銷毀對話框窗口
36、,這是由OnCancel函數(shù)來完成的;然后是銷毀對話框?qū)嵗?,這是由PostNcDestroy函數(shù)來完成的。所以,如果是單單創(chuàng)建模式對話框,就不需要在CMyDialog中重載OnCancel和PostNcDestroy了,用CDialog中的就行了(況且模式對話框根本就不需要PostNcDestroy函數(shù))。但是,如果是創(chuàng)建非模式對話框就不同了,CDialog:Create會立即返回,進入普通的循環(huán),即主窗口循環(huán),不像模式對話框的DoModel函數(shù)要到對話框窗口關閉之后才返回,其內(nèi)部有消息循環(huán)。所以,非模式對話框?qū)嵗裰鞔翱趯嵗粯釉谶M程堆中申請,實例銷毀時也要調(diào)用PostNcDestroy函
37、數(shù)。void CMyDialog:OnCancel() / 用戶關閉對話框 if(m_bModeless) /如果是非模式對話框,就不能在內(nèi)置循環(huán)中調(diào)用OnCancel函數(shù),因為 DestroyWindow(); /那么做了,程序可能會把消息發(fā)送給主窗口,那么關閉的就是主窗口 else /了,就不能關閉對話框了 CDialog:OnCancel(); 消息響應的區(qū)別在消息響應方面,模式對話框和非模式對話框之間又有著很大的區(qū)別。模式對話框工作的時候,它有內(nèi)部的消息泵機制,控件之間的交互不用我們?nèi)藶榈娜タ刂?,系統(tǒng)會幫助我們?nèi)ヌ幚怼7悄J綄υ捒騽t像普通窗口一樣,則由WinMain中書寫的消息循環(huán)驅(qū)動
38、。但由于是對話框,它對一些消息有特殊的處理。因此,在消息循環(huán)中,需要先對對話框提供截獲消息的機會。while (GetMessage(&msg, NULL, 0, 0) if (hDlgModeless = 0 | !IsDialogMessage(hDlgModeless, &msg) TranslateMessage(&msg); DispatchMessage( &msg); 如果當前取得的消息是對話框的消息,IsDialogMessage 將它交由對話消息處理函數(shù)處理,并返回TRUE。不需要再派發(fā)了。注意:這個方法并不是很好用,因為當對話框過多的時候,處
39、理起來就比較麻煩了。另一種處理的方法是利用子類化控件的方法,來處理控件間的交互。銷毀的區(qū)別模式對話框的銷毀是使用EndDialog,而非模式對話框的銷毀是使用DestroyWindow.。所以我們在銷毀對話框的時候,也要對其進行區(qū)別。非模式對話框,用戶關閉對話框時,對話框消息處理函數(shù)將收到WM_CLOSE消息,接到后調(diào)用DestroyWindow以銷毀非模式對話框。模式對話框,則一般響應IDOK和IDCANCEL。在PPC上,我們對于OK鍵和X鍵的處理要注意這點。其他非模態(tài)對話框的模板必須具有Visible風格,否則對話框?qū)⒉豢梢姡B(tài)對話框則無需設置該項風格。更保險的辦法是調(diào)用ShowWindow(hDialog, SW_SHOW)來顯示對話框,而不管對話框是否具有Visible風格。非模態(tài)對話框?qū)ο笫怯胣ew操作符在堆中動態(tài)創(chuàng)建的,而不是以成員變量的形式嵌入到別的對象中或以局部變量的形式構建在堆棧上。通常應在對話框的擁有者窗口類內(nèi)聲明一個
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 遼寧政法職業(yè)學院《建筑模型制作實踐》2023-2024學年第一學期期末試卷
- 蘭州交通大學《影視劇創(chuàng)作》2023-2024學年第一學期期末試卷
- 江西經(jīng)濟管理職業(yè)學院《中醫(yī)經(jīng)典傷寒論》2023-2024學年第一學期期末試卷
- 吉首大學《痕跡信息系統(tǒng)應用》2023-2024學年第一學期期末試卷
- 湖南高爾夫旅游職業(yè)學院《建筑材料與構造1》2023-2024學年第一學期期末試卷
- 黑龍江外國語學院《系統(tǒng)辨識及自適應控制》2023-2024學年第一學期期末試卷
- 重慶建筑科技職業(yè)學院《光纖通信系統(tǒng)》2023-2024學年第一學期期末試卷
- 中央音樂學院《高級統(tǒng)計分析》2023-2024學年第一學期期末試卷
- 小學五年專項發(fā)展規(guī)劃(教學工作)
- 長春工業(yè)大學人文信息學院《小學體育教師基本功》2023-2024學年第一學期期末試卷
- 產(chǎn)品質(zhì)量反饋、回復單
- GB/T 7424.2-2002光纜總規(guī)范第2部分:光纜基本試驗方法
- 《材料分析測試技術》全套教學課件
- 人教版8年級上英語各單元語法課件大全
- (完整版)形式發(fā)票模版(國際件通用)
- 武漢東湖賓館建設項目委托代建合同
- 安徽大學大學生素質(zhì)教育學分認定辦法
- 高度限位裝置類型及原理
- 中文版gcs electrospeed ii manual apri rev8v00印刷稿修改版
- 新生兒預防接種護理質(zhì)量考核標準
- 除氧器出水溶解氧不合格的原因有哪些
評論
0/150
提交評論