在mfc里面,pretranslatemessage是一个很重要的虚函数。这个函数的作用这里就不谈了,很多地方都有涉及,这里只谈一下其实现的机制。
谈到pretranslatemessage的实现,便不得不谈到mfc消息循环的实现。mfc通过cwinapp类中的pumpmessage函数实现消息循环,但是实际的消息循环代码位于cwinthread中,cwinapp只是从cwinthread继承过来。其简化后的代码大概如下:
bool cwinthread::pumpmessage()
{
_afx_thread_state *pstate = afxgetthreadstate();
::getmessage(&(pstate->m_msgcur), null, null, null))
if (!afxpretranslatemessage(&(pstate->m_msgcur)))
{
::translatemessage(&(pstate->m_msgcur));
::dispatchmessage(&(pstate->m_msgcur));
}
return true;
}