最近在寫程序時,出現了對話框里面不接收鍵盤消息的情況,特別搜索了以下內容
MFC中對話框是不會直接響應OnChar和OnKeyDown消息的,會被 其它控件攔截,測試時發現不會進入這兩個函數,必須重定義PreTranslateMessage()虛函數才能正確地
進入這兩個消息函數,具體實現如下:
這樣,程序就能正確地調用onKeyDown和onChar這兩個函數了,且onKeyDown()在onCchar()之前處理的。這樣就能在對話框中響應WM_CHAR、WM_KEYDOWM消息了,注意在發送WM_CHAR時,實際發送了三個消息
所以,如果你有如下代碼:
會彈出兩個消息對話框 ,所以最好單獨在WM_KEYDOWM或WM_KEYUP處理事件。
PreTranslateMessage是消息在送給TranslateMessage函數之前被調用的,絕大多數本窗口的消息都要通過這里,比較常用,當你需要在MFC之前處理某些消息時,常常要
在這里添加代碼. MFC消息控制流最具特色的地方是CWnd類的虛擬函數PreTranslateMessage(),通過重載這個函數,我們可以改變MFC的消息控制流程,甚至可以作一個
全新的控制流出來。只有穿過消息隊列的消息才受PreTranslateMessage()影響,采用SendMessage()或其他類似的方式向窗口直接發送的而不經過消息隊列的消息根本不
會理睬PreTranslateMessage()的存在。
一、是否調用TranslateMessage()和DispatchMessage()是由一個名稱為PreTranslateMessage()函數的返回值決定的,如果該函數返回TRUE,則不會把該消息分
發給窗口函數處理。
二、傳給PreTranslateMessage()的消息是未經翻譯過的消息,它沒有經過TranslateMessage()處理。可以在該函數中使用(pMsg->wParam==VK_RETURN)來攔
截回車鍵。
進入這兩個消息函數,具體實現如下:
BOOL CTestDlg::PreTranslateMessage(MSG* pMsg) { SendMessage(pMsg->message,pMsg->wParam,pMsg->lParam); return 0; //return CDialog::PreTranslateMessage(pMsg); }
這樣,程序就能正確地調用onKeyDown和onChar這兩個函數了,且onKeyDown()在onCchar()之前處理的。這樣就能在對話框中響應WM_CHAR、WM_KEYDOWM消息了,注意在發送WM_CHAR時,實際發送了三個消息
即 WM_CHAR WM_KEYDOWM WM_KEYUP
所以,如果你有如下代碼:
void CMy1Dlg::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) { // TODO: Add your message handler code here and/or call default if(nChar=='a') MessageBox("a"); CDialog::OnChar(nChar, nRepCnt, nFlags); }
會彈出兩個消息對話框 ,所以最好單獨在WM_KEYDOWM或WM_KEYUP處理事件。
PreTranslateMessage是消息在送給TranslateMessage函數之前被調用的,絕大多數本窗口的消息都要通過這里,比較常用,當你需要在MFC之前處理某些消息時,常常要
在這里添加代碼. MFC消息控制流最具特色的地方是CWnd類的虛擬函數PreTranslateMessage(),通過重載這個函數,我們可以改變MFC的消息控制流程,甚至可以作一個
全新的控制流出來。只有穿過消息隊列的消息才受PreTranslateMessage()影響,采用SendMessage()或其他類似的方式向窗口直接發送的而不經過消息隊列的消息根本不
會理睬PreTranslateMessage()的存在。
一、是否調用TranslateMessage()和DispatchMessage()是由一個名稱為PreTranslateMessage()函數的返回值決定的,如果該函數返回TRUE,則不會把該消息分
發給窗口函數處理。
二、傳給PreTranslateMessage()的消息是未經翻譯過的消息,它沒有經過TranslateMessage()處理。可以在該函數中使用(pMsg->wParam==VK_RETURN)來攔
截回車鍵。
