深入探討MFC消息循环和消息泵.docVIP

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
深入探討MFC消息循环和消息泵

深入探讨MFC消息循环和消息泵 首先,应该清楚MFC的消息循环(::GetMessage,::PeekMessage),消息泵(CWinThread::PumpMessage)和MFC的消息在窗口之间的路由是两件不同的事情。在MFC的应用程序中(应用程序类基于CWinThread继承),必须要有一个消息循环,他的作用是从应用程序的消息队列中读取消息,并把它派送出去(::DispatchMessage)。而消息路由是指消息派送出去之后,系统(USER32.DLL)把消息投递到哪个窗口,以及以后消息在窗口之间的传递是 怎样的。 ? 消息分为队列消息(进入线程的消息队列)和非队列消息(不进入线程的消息队列)。对于队列消息,最常见的是鼠标和键盘触发的消息,例如WM_MOUSERMOVE,WM_CHAR等消息;还有例如:WM_PAINT、WM_TIMER和WM_QUIT。当鼠标、键盘事件被触发后,相应的鼠标或键盘驱动程序就会把这些事件转换成相应的消息,然后输送到系统消息队列,由Windows系统负责把消息加入到相应线程的消息队列中,于是就有了消息循环(从消息队列中读取并派送消息)。还有一种是非队列消息,他绕过系统队列和消息队列,直接将消息发送到窗口过程。例如,当用户激活一个窗口系统发送WM_ACTIVATE, WM_SETFOCUS, and WM_SETCURSOR。创建窗口时发送WM_CREATE消息。在后面你将看到,MS这么设计是很有道理的,以及他的整套实现机制。 ? 这里讲述MFC的消息循环,消息泵。先看看程序启动时,怎么进入消息循环的: _tWinMain -AfxWinMain -AfxWinInit -CWinThread::InitApplication -CWinThread::InitInstance -CWinThread::Run ? 非对话框程序的消息循环的事情都从这CWinThread的一Run开始... ? 第一部分:非对话框程序的消息循环机制。 //thrdcore.cpp // main running routine until thread exits int CWinThread::Run() { ?ASSERT_VALID(this); ?// for tracking the idle time state ?BOOL bIdle = TRUE; ?LONG lIdleCount = 0; ?// acquire and dispatch messages until a WM_QUIT message is received. ?for (;;) ?{ ? // phase1: check to see if we can do idle work ? while (bIdle ?? !::PeekMessage(m_msgCur, NULL, NULL, NULL, PM_NOREMOVE)) ? { ?? // call OnIdle while in bIdle state ?? if (!OnIdle(lIdleCount++)) ??? bIdle = FALSE; // assume no idle state ? } ? // phase2: pump messages while available ? do ? { ?? // pump message, but quit on WM_QUIT ?? if (!PumpMessage()) ??? return ExitInstance(); ?? // reset no idle state after pumping normal message ?? if (IsIdleMessage(m_msgCur)) ?? { ??? bIdle = TRUE; ??? lIdleCount = 0; ?? } ? } while (::PeekMessage(m_msgCur, NULL, NULL, NULL, PM_NOREMOVE)); ?}??? //无限循环,退出条件是收到WM_QUIT消息。 ?ASSERT(FALSE);? // not reachable } 这是一个无限循环,他的退出条件是收到WM_QUIT消息: if (!PumpMessage()) ??? return ExitInstance(); ?? 在PumpMessage中,如果收到WM_QUIT消息,那么返回FALSE,所以ExitInstance()函数执行,跳出循环,返回程序的退出代码。所以,一个程序要退出,只用在代码中调用函数 ? VOID PostQuitMessage( int nExitCode )。指定退出代码n

文档评论(0)

d47fv82b5hI + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档