轉載:https://blog.csdn.net/foreverhuylee/article/details/25378221
關於PreTranslateMessage
MFC消息控制流最具特色的地方是CWnd類的虛擬函數PreTranslateMessage(),通過重載這個函數,我們可以改變MFC的消息控制流程,甚至可以作一個全新的控制流出來。只有穿過消息隊列的消息才受PreTranslateMessage()影響,采用SendMessage()或其他類似的方式向窗口直接發送的而不經過消息隊列的消息根本不會理睬PreTranslateMessage()的存在。
顧名思義,PreTranslateMessage就是消息發送給窗口之前,提前攔截消息,然后對消息進行處理(即,改變了MFC的消息控制流程)
要注意一下兩點:
1、是否調用TranslateMessage()和DispatchMessage()是由一個名稱為PreTranslateMessage()函數的返回值決定的,如果該函數返回TRUE,則不會把該消息分發給窗口函數處理。
2、
傳給PreTranslateMessage()的消息是未經翻譯過的消息,它沒有經過TranslateMessage()處理。可以在該函數中使用(pMsg->wParam==VK_RETURN)來攔截回車鍵。
根據以上說明我們在自己的Dlalog里面重寫BOOL PreTranslateMessage(MSG* pMsg)函數
BOOL CXXXDlg::PreTranslateMessage(MSG* pMsg) { // TODO: 在此添加專用代碼和/或調用基類 CEdit* pEdit = (CEdit*)GetDlgItem(IDC_EDIT1); ASSERT(pEdit && pEdit->GetSafeHwnd());//如果對話框上有多個編輯控件,我們只想對指定對象過濾的話,我們可以在外面加層判斷,是哪個控件 if (GetFocus() == GetDlgItem(IDC_EDIT1))//對指定控件消息過濾 { if (pMsg->message == WM_CHAR) { //VK_0 ~ VK_9 are the same as ASCII '0' ~'9'(0x30~ 0x39) //屏蔽除數字、小數點、符號(-)、回退之外所有的輸入 小數點(.) ASCII-->46 VK_INSERT(-) 負號 if (pMsg->wParam != '.' && !(pMsg->wParam >= '0' && pMsg->wParam <= '9') && pMsg->wParam != VK_BACK&& pMsg->wParam != VK_INSERT) { return TRUE;// 使消息不再進行處理 } } else if (pMsg->message == WM_KEYDOWN)//屏蔽 ESC、空格、回車 { if (pMsg->wParam == VK_ESCAPE || pMsg->wParam == VK_SPACE || pMsg->wParam == VK_RETURN) { return TRUE;// 使消息不再進行處理 } } } return CDialogEx::PreTranslateMessage(pMsg); }