1. 程式人生 > >總結OnOK、OnCancel、OnDestroy函式之間的區別

總結OnOK、OnCancel、OnDestroy函式之間的區別

第一,OnOk()和OnCancel()是CDialog基類的成員函式,即ID為ID_OK和ID_CANCEL的按鈕的通知訊息的響應函式,而OnClose()和OnDestroy()是CWnd基類的成員函式,即WM訊息響應函式

第二,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_QUITT訊息,結束訊息迴圈

可以看到,程式的退出過程,是先響應OnClose(),然後響應OnDestroy()。OnDestroy中呼叫PostQuitMessage()傳送WM_QUIT訊息結束訊息迴圈。

如果沒有重定義OnClose函式的話

在對話方塊程式中,

1)使用者點選X關閉按鈕,呼叫的是CDialog::OnCancel函式

(2)在CDialog::OnCancel的處理函式中,呼叫CDialog::EndDialog關閉對話方塊;銷燬與指定CDialog物件關聯的對話方塊,但沒有銷燬CDialog物件

(3)在CDialog::EndDialog中傳送了WM_DESTROY訊息----------->視窗銷燬後響應OnDestroy();

(4)在WM_DESTROY訊息中呼叫PostQuitMessage(),傳送WM_QUITT訊息,結束訊息迴圈

可以看到,程式的退出過程,是先響應OnCancel(),然後響應OnDestroy()。OnDestroy中呼叫PostQuitMessage()傳送WM_QUIT訊息結束訊息迴圈。

第三,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()

所以我們在按下cancel按鈕的時候,程式不會執行OnClose(),而是呼叫了直接呼叫了CDialog::EndDialog(),然後呼叫了OnDestroy()