我們知道,在對話框中,屏蔽ESC鍵自動退出可以選擇重載OnCancel為啞函數的方法:
void CXXXXDlg::OnCancel()
{
// TODO: Add your specialized code here and/or call the base class
//CDialog::OnCancel(); //disable OnCancel
}
但是,這樣一來,右上角的關閉按鈕也不起作用了,是因為點擊關閉按鈕時會自動調用CXXXXDlg::OnCancel()l從而完成對話框的關閉,由於CXXXXDlg::OnCancel()中什麼也沒有做,因此對話框就無法關閉。修改這個bug需要重載OnClose消息函數:
void CXXXXDlg::OnClose()
{
// TODO: Add your message handler code here and/or call default
CDialog::OnCancel(); //add OnCancel here
CDialog::OnClose();
}
由於OnCancle實際上是調用Enddialog(IDCANCEL),所以也可以按照如下修改:
void CXXXXDlg::OnClose()
{
// TODO: Add your message handler code here and/or call default
EndDialog(IDCANCEL);
CDialog::OnClose();
}
我們知道OnClose函數是WM_CLOSE消息的響應函數,但是為什麼發送WM_CLOSE消息後會自動調用CXXXXDlg::OnCancel()?自己跟了一下代碼,大致梳理了一下流程:
WM_CLOSE
-> 進入void CXXXXDlg::OnClose()
-> CDialog::OnClose()
-> void CXXXXDlg::OnClose()返回
-> void CXXXXDlg::OnCancel()
比較神奇的是 CDialog::OnClose() 函數:
這個函數中不知道以何種方式告知系統在 CXXXXDlg::OnClose() 返回 後去調用 CXXXXDlg::OnCancel(),在調試中如果把這個函數注釋掉,則不會轉入CXXXXDlg::OnCancel()函數中。而且,對於CXXXXDlg::OnCancel()函數的調用是在CXXXXDlg::OnClose() 返回 後,如果采用消息,我覺得是否應該不會在返回後調用,而應該在消息發送後馬上處理。
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.Net/silvervi/archive/2009/12/17/5027100.ASPx