作用:
PreTranslateMessage 是消息在送给 TranslateMessage 函数之前被调用的,绝大多数本
窗口的消息都要通过这里,比较常用,当需要在 MFC 之前处理某些消息时,常常要在这里添
加代码.
MFC 消息控制流最具特色的地方是 CWnd 类的虚拟函数 PreTranslateMessage(),通
过重载这个函数,可以改变 MFC 的消息控制流程,甚至可以作一个全新的控制流出来。只有
穿过消息队列的消息才受 PreTranslateMessage()影响,采用 SendMessage()或其他类似
的方式向窗口直接发送的而不经过消息队列的消息根本不会理睬 PreTranslateMessage()的
存在。aa
是否调用 TranslateMessage()和 DispatchMessage()是由一个名称为
PreTranslateMessage()函数的返回值决定的,如果该函数返回 TRUE,则不会把该消息分发
给窗口函数处理。
传给 PreTranslateMessage()的消息是未经翻译过的消息,它没有经过
TranslateMessage()处理。可以在该函数中使用(pMsg->wParam==VK_RETURN)来拦截
回车键。wParam 中存放的是键盘上字符的虚拟码。a
PeekMessage 和 GetMessage 的区别:a
GetMessage 在没有消息的时候等待消息,cpu 当然低a
PeekMessage 没有消息的时候立刻返回,所以 cpu 占用率高。a
因为游戏不能靠 windows 消息驱动,所以要用 PeekMessage();
原理分析:
PretranslateMessage 的实现,不得不谈到 MFC 消息循环的实现。MFC 通过 CWinApp
类中的 Pumpmessage 函数实现消息循环,但是实际的消息循环代码位于 CWinThread 中,
CWinApp 只是从 CWinThread 继承过来。其简化后的代码大概如下:a
Title BOOLCWinThread::PumpMessage()
{
_AFX_THREAD_STATE*pState=AfxGetThreadState();
a
::GetMessage(&(pState->m_msgCur),NULL,NULL,NULL))
a
if(!AfxPreTranslateMessage(&(pState->m_msgCur)))
{
::TranslateMessage(&(pState->m_msgCur));
::DispatchMessage(&(pState->m_msgCur));
}
returnTRUE;