vc++生成的對話框程序默認是不會響應OnChar和OnKeyDown消息的,會被其它控件攔截
如果不修改代碼,使用時會發現不會進入這兩個事件響應函數,必須修改重寫PreTranslateMessage()虛函數才能正確地
響應這兩個消息函數,具體實現如下:
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處理事件。