virtual BOOL PreTranslateMessage(MSG* pMsg)
?{
????
???return CWindow::IsDialogMessage(pMsg);
?}
改成:
virtual BOOL PreTranslateMessage(MSG* pMsg)
?{
??if(pMsg->message == WM_KEYDOWN?? &&?? pMsg->wParam == VK_ESCAPE)???? return?? TRUE;??
??if(pMsg->message == WM_KEYDOWN?? &&?? pMsg->wParam == VK_RETURN)???? return?? TRUE;????
??else????
???return CWindow::IsDialogMessage(pMsg);
?}
---------------------------------------------
MFC:
BOOL?? CxxxDlg::PreTranslateMessage(MSG*?? pMsg)????
? {??
??? if(pMsg->message==WM_KEYDOWN?? &&?? pMsg->wParam==VK_ESCAPE)???? return?? TRUE;??
??? if(pMsg->message==WM_KEYDOWN?? &&?? pMsg->wParam==VK_RETURN)?? return?? TRUE;????
??? else????
????????? return?? CDialog::PreTranslateMessage(pMsg);??
? }
--------------------
在一般情況下編寫的對話框程序,用戶在運(yùn)行的時候,如果不注意按下了ENTER或者ESC鍵,程序就會立刻退出,之所以會這樣,是因為按下Enter鍵時,Windows就會自動去找輸入焦點落在了哪一個按鈕上,當(dāng)獲得焦點的按鈕的四周將被點線矩形包圍。如果所有按鈕都沒有獲得輸入焦點,Windows 就會自動去尋找程序或資源所指定的默認(rèn)按鈕(默認(rèn)按鈕邊框較粗)。如果對話框沒有默認(rèn)按鈕,那么即使對話框中沒有OK按鈕,OnOK函數(shù)也會自動被調(diào)用,對于一個普通的對話框程序來說,OnOK函數(shù)的調(diào)用,以為著程序會立刻退出。為了使Enter鍵無效,最簡單的辦法就是將CExDlg的OnOK函數(shù)寫成空函數(shù),然后針對OK按鈕寫一個新的函數(shù)來響應(yīng)。ESC鍵的原理也是如此,它是默認(rèn)和OnCancel函數(shù)映射在一起的。對于ESC鍵,需要自己重載 CDialog類的PreTranslateMessage函數(shù),當(dāng)發(fā)現(xiàn)是ESC鍵的時候,過濾掉這個消息或者是替換掉這個消息。??
???
?