在項目完備時,我們通常會發現當點擊Enter鍵或者ESC時程序便會退出,而我們需要的是只要不點擊“差”,程序便不會退出,本文主要涉及MFC中的Enter、ESC的屏蔽以及PreTranslateMessage
首先說下PreTranslateMessage
函數原型為:virtual BOOL PreTranslateMessage(MSG* pMsg);
其功能是:PreTranslateMessage是消息在送給TranslateMessage函數之前被調用的,絕大多數本窗口的消息都要通過這里,比較常用,當你需要在MFC之前處理某些消息時,常常要在這里添加代碼。重載該函數可以實現窗口消息在派發給窗口函數TranslateMessage()和DispatchMessage()之前的過濾,MFC中,PreTranslateMessage()是虛函數,我們可以重載它來處理鍵盤和鼠標消息。
說明:該函數會在窗口函數執行前進行消息的處理,如果消息返回值為true,則消息處理終止,不會調用TranslateMessage()和DispatchMessage()來翻譯和分發消息給相應的窗口;如果返回false,調用翻譯和分發消息函數,只有穿過消息隊列的消息才受PreTranslateMessage()影響,采用SendMessage()或其他類似的方式向窗口直接發送的而不經過消息隊列的消息根本不會理睬PreTranslateMessage()的存在。
PeekMessage和GetMessage:GetMessage在沒有消息的時候等待消息,效率低。PeekMessage沒有消息的時候立刻返回,所以CPU占用率高。因為游戲不能靠Windows消息驅動,所以要用PeekMessage();PreTranslateMessage則是基於GetMessage的。
屏蔽Enter和ESC舉例:
1 BOOL CFileAndFolderDlg::PreTranslateMessage(MSG* pMsg) 2 { 3 // 屏蔽Enter、ESC 4 if(pMsg->message == WM_KEYDOWN && (pMsg->wParam == VK_ESCAPE) || (pMsg->wParam == VK_RETURN)) 5 return TRUE; 6 return CDialog::PreTranslateMessage(pMsg); 7 }