b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

translatemessage_sendmessage_updatewindow

电脑杂谈  发布时间:2017-05-28 08:24:03  来源:网络整理

PreTranslateMessage是消息在送给TranslateMessage函数之前被调用的,绝大多数本窗口的消息都要通过这里,比较常用,当需要在MFC之前处理某些消息时,常常要在这里添加代码.

MFC 消息控制流最具特色的地方是CWnd类的虚拟函数PreTranslateMessage(),通过重载这个函数,可以改变MFC的消息控制流程,甚至可 以作一个全新的控制流出来。只有穿过消息队列的消息才受PreTranslateMessage()影响,采用SendMessage()或其他类的方 式向窗口直接发送的而不经过消息队列的消息根本不会理睬PreTranslateMessage()的存在。

是否调用TranslateMessage()和DispatchMessage()是由一个名称为PreTranslateMessage()函数的返回决定的,如果该函数返回TRUE,则不会把该消息分发给窗口函数处理。translatemessagetranslatemessage

传给PreTranslateMessage()的消息是未经翻译过的消息,它没有经过TranslateMessage()处理。可以在该函数中使用(pMsg->wParam==VK_RETURN)来拦截回车键。wParam中存放的是键盘上字符的虚拟码。

PeekMessage和GetMessage的区别:

GetMessage在没有消息的时候等待消息,cpu当然低

PeekMessage没有消息的时候立刻返回,所以cpu占用率高。

因为游戏不能靠windows消息驱动,所以要用PeekMessage();

PretranslateMessage 的实现,不得不谈到MFC消息循环的实现。MFC通过CWinApp类中的Pumpmessage函数实现消息循环,但是实际的消息循环代码位于 CWinThread中,CWinApp只是从CWinThread继承过来。其简化后的代码大概如下:

BOOLCWinThread::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));

}

returnTRUE;

}

可以看到,PumpMessage在实际的TranslateMessage和DispatchMessage发生之前会调用 AfxPreTranslateMessage,AfxPreTranslateMessage又会调用 CWnd::WalkPreTranslateTree(虽然也会调用其他函数,但是这个最为关键),其代码如下:

BOOLPASCALCWnd::WalkPreTranslateTree(HWNDhWndStop,MSG*pMsg)

{

ASSERT(hWndStop==NULL||::IsWindow(hWndStop));

ASSERT(pMsg!=NULL);

//walkfromthetargetwindowuptothehWndStopwindowchecking


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/ruanjian/article-49683-1.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...