PreTranslateMessage是消息在送给TranslateMessage函数之前被调用的,绝大多数本窗口的消息都要通过这里,比较常用,当你需要在MFC之前处理某消息时,常常要在这里添加代码。MFC消息控制流最具特色的地方是CWnd类的虚拟函数PreTranslateMessage(),通过重载这个函数,我们可以改变MFC的消息流程,甚至可以作一个全新的控制流出来。只有窗过消息队列的消息才受PreTranslateMessage()影响,采用SendMessage()或其他类似的方式向窗口直接发送的而不经过消息队列的消息根本不会理睬PreTranslateMessage的存在。
BOOL CDlgKeyMessageDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
if(pMsg->message == WM_KEYDOWN) //如果用户按下了按键
{
CString strwParam;
strwParam.Format("用户按键的虚拟键码为:%d ",pMsg->wParam);
CDC* pDC = m_ctlframe.GetDC(); //获取DC
pDC->TextOut(2,2,strwParam); //显示文本
ReleaseDC(pDC); //释放DC
// OnKeyDown(pMsg->wParam, LOWORD(pMsg->lParam), HIWORD(pMsg->lParam));
}
return CDialog::PreTranslateMessage(pMsg);
}
void CDlgKeyMessageDlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
AfxMessageBox("hello");
CDialog::OnKeyDown(nChar, nRepCnt, nFlags);
}