Chinaunix首页 | 论坛 | 博客
  • 博客访问: 16497865
  • 博文数量: 5645
  • 博客积分: 9880
  • 博客等级: 中将
  • 技术积分: 68081
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-28 13:35
文章分类

全部博文(5645)

文章存档

2008年(5645)

我的朋友

分类:

2008-04-28 20:57:32

下载本文示例代码
  首先,应该清楚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 exitsint 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 )。指定退出代码nExitCode就可以退出程序。共4页。 1 2 3 4 :   首先,应该清楚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 exitsint 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 )。指定退出代码nExitCode就可以退出程序。共4页。 1 2 3 4 : 下载本文示例代码


深入探讨MFC消息循环和消息泵深入探讨MFC消息循环和消息泵深入探讨MFC消息循环和消息泵深入探讨MFC消息循环和消息泵深入探讨MFC消息循环和消息泵深入探讨MFC消息循环和消息泵深入探讨MFC消息循环和消息泵深入探讨MFC消息循环和消息泵深入探讨MFC消息循环和消息泵深入探讨MFC消息循环和消息泵深入探讨MFC消息循环和消息泵深入探讨MFC消息循环和消息泵深入探讨MFC消息循环和消息泵深入探讨MFC消息循环和消息泵深入探讨MFC消息循环和消息泵
阅读(252) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~