總結OnOK()、OnCancel()、OnClose()、OnDestroy()之間的區別(轉)


第一,OnOK()和OnCancel()是CDialog基類的成員函數,而OnClose()和OnDestroy()是CWnd基類的成員函數,即WM消息響應函數。從應用程序結構的角度,拿對話框來說,紅色的X對應的是CWnd,而處於對話框中的“確定”、“取消”按鈕則對應了CDialog。

第二,OnClose()和OnDestroy()

在單視圖程序中,根據<<深入淺出MFC>>所講,程序退出時執行的操作順序為(從點X按鈕開始)
(1)用戶點擊X退出按鈕,發送了WM_CLOSE消息----->響應OnClose()
(2)在WM_CLOSE消息的處理函數中,調用DestroyWindow()----->銷毀與指定CWnd窗口對象關聯的窗口,但未銷毀CWnd對象
(3)在DestroyWindow()中發送了WM_DESTROY消息----->窗口銷毀后響應OnDestroy()
(4)在WM_DESTROY消息中調用PostQuitMessage(),發送WM_QUIT消息,結束消息循環

可以看到,程序的退出過程,是先響應OnClose(),然后響應OnDestroy(),在響應OnDestroy()之前,窗口對象已經被銷毀。OnDestroy()到底干了什么呢?它就像一個teller,先通知CWnd對象告訴它即將被銷毀,爾后OnDestroy的真正運行是在CWnd對象已經從屏幕上清除以后被調用的。

第三,OnOK()、OnCancel()()、OnClose()、OnDestroy()

CDialog::OnOK首先調用UpdateData(TRUE)將數據傳給對話框成員變量,然后調用CDialog::EndDialog關閉對話框;   
CDialog::OnCancel只調用CDialog::EndDialog關閉對話框;   
OnClose()是響應   WM_CLOSE   的.一定程度上可以說CDialog::EndDialog()和OnClose()完成類似的工作,但處理的機制不一樣,前者是CDialog的對象機制,后者是WM的消息映射機制。

CDialog::EndDialog()-------->OnDestroy()

                 OnClose()-------->OnDestroy()

EndDialog()和OnClose()屬於“同級別”的,所以我們在按下OK按鈕的時候,程序是不會執行OnClose()的,但兩種機制都必須經過OnDestroy()

本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/wind1987321/archive/2009/09/21/4576585.aspx 

然后發現

下面這兩種說法不明晰

(1) EndDialog(-1);
關閉模態對話框,並且將參數作為父對話框調用的返回值。
(2)  DestroyWindow();  ::PostQuitMessage(0);
DestroyWindow 關閉非模態對話框。 退出消息循環,真正結束進程。有不少程序窗口關閉,但是不等於退出運行。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM