過載OnOK、OnCancel、OnClose
轉載:https://www.cnblogs.com/BeyondTechnology/archive/2011/02/20/1959293.html
推薦:深入淺出過載OnOK、OnCancel、OnClose
MFC預設建立的Dialog按Esc響應OnCancel,回車響應OnOK,都會關閉對話方塊,只要過載OnOk和OnCancel函式即可,但此時點選關閉按鈕無法關閉視窗,還需要再過載OnClose函式。程式碼如下:
void CMFCDemoDlg::OnBnClickedOk()
{
// TODO: Add your control notification handler code here
//OnOK();
}
void CMFCDemoDlg::OnBnClickedCancel()
{
// TODO: Add your control notification handler code here
//OnCancel();
}
void CMFCDemoDlg::OnClose()
{
// TODO: Add your message handler code here and/or call default
OnCancel();
//CDialog::OnClose();
}
總結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()