深入剖析WTL—WTL消息循环机制详解
来源:互联网 发布:注册域名要钱吗 编辑:程序博客网 时间:2024/05/29 12:03
WTL消息循环机制实现了消息过滤和空闲处理机制。
消息过滤
首先看一下CMessageLoop的核心逻辑CMessageLoop.Run()的代码:
int CMessageLoop.Run(){BOOL bDoIdle = TRUE;int nIdleCount = 0;BOOL bRet;for(;;){while(!::PeekMessage(&m_msg, NULL, 0, 0, PM_NOREMOVE) && bDoIdle){if(!OnIdle(nIdleCount++))bDoIdle = FALSE;}bRet = ::GetMessage(&m_msg, NULL, 0, 0);if(bRet == -1){ATLTRACE2(atlTraceUI, 0, _T("::GetMessage returned -1 (error)/n"));continue;// error, don't process}else if(!bRet){ATLTRACE2(atlTraceUI, 0, _T("CMessageLoop::Run - exiting/n"));break;// WM_QUIT, exit message loop}if(!PreTranslateMessage(&m_msg)){::TranslateMessage(&m_msg);::DispatchMessage(&m_msg);}if(IsIdleMessage(&m_msg)){bDoIdle = TRUE;nIdleCount = 0;}}return (int)m_msg.wParam;}
在上面的代码中,有三个需要注意的地方。
消息循环中,首先调用PeekMessage()判断消息队列中是否有消息。如果没有,则调用OnIdle()函数。这就是调用空闲处理。
第二个注意点是,如果有消息,则调用GetMessage()得到消息。然后做判断,如果是错误返回,则对消息并不进行处理。然后再判断是否是WM_QUIT消息,如果是,则退出消息循环,从而结束该界面线程。
接下来是第三个注意点。在TranslateMessage()消息之前,调用了成员函数PreTranslateMessage()。这为在TranslateMessage()之前对消息进行处理提供了机会。
PreTranslateMessage()会遍历CMessageLoop中所有CMessageFilterd对象的PreTranslateMessage()函数,直到其中一个返回为TRUE或它们都返回为FALSE。当有一个返回为TRUE时,即对消息处理了,那么,就不再调用TranslateMessage(),而是进入下一个循环。
这种消息过滤机制提供了一种在不同窗口之间传递消息的机制。
CMessageFilter是一个C++的接口,即只定义了抽象虚拟函数。
class CMessageFilter {public:virtual BOOL PreTranslateMessage(MSG* pMsg) = 0;};
这样,任何类想要实现消息过滤,只需实现这个接口。在C++中就采用继承。然后再实现PreTranslateMessage()函数即可。
ATL/WTL App Wizard生成的框架窗口中实现PreTranslateMessage()的代码如下:
BOOL CMainFrame::PreTranslateMessage(MSG* pMsg){if(CFrameWindowImpl<CMainFrame>::PreTranslateMessage(pMsg))return TRUE;return m_view.PreTranslateMessage(pMsg);}
这种消息过滤机制的好处是任何实现了CMessageFilter接口的对象,都可以接受消息过滤。
程序通过AddMessageFilter()和RemoveMessageFilter()把这些对象加入到CMessageLoop中。
空闲处理
空闲处理的机制和消息过滤类似。这里不再介绍。我们要把主要经历放在WTL的框架窗口分析上。稍后,我们将进入这部分内容。
原文:http://blog.csdn.net/jznsmail/article/details/200928
- 深入剖析WTL—WTL消息循环机制详解
- 深入剖析WTL—WTL消息循环机制详解
- 深入剖析WTL—WTL消息循环机制详解
- 深入剖析WTL—WTL消息循环机制详解
- 浅析wtl消息循环机制
- 深入剖析WTL
- 深入剖析WTL
- 深入剖析WTL—WTL框架窗口分析(1)
- 深入剖析WTL—WTL框架窗口分析(2)
- 深入剖析WTL—WTL框架窗口分析(3)
- 深入剖析WTL—WTL框架窗口分析(4)
- 深入剖析WTL—WTL框架窗口分析(5)
- 深入剖析WTL—WTL框架窗口分析(6)
- 深入剖析WTL—WTL框架窗口分析1
- 深入剖析WTL—WTL框架窗口分析 (2)
- 深入剖析WTL—WTL框架窗口分析(3)
- 深入剖析WTL—WTL框架窗口分析(6)
- 深入剖析WTL—WTL框架窗口分析(5)
- linux 与windows 设置共享文件夹或卷盘
- ORA-01503: CREATE CONTROLFILE failed
- poj 1815 Friendship 网络流
- 黑马程序员html相关基础
- MySQL性能建议者:mysqltuner.pl
- 深入剖析WTL—WTL消息循环机制详解
- 线段树入门 以HDU 4325为例(未离散化,也没lazy标记)
- 距离和相似度度量
- linux 设备驱动编程
- aaa
- java ----线程间通讯
- 河软CSDN高校俱乐部纳新喽、、、、、、
- nginx alow deny
- RTMPdump(libRTMP) 源代码分析 6: 建立一个流媒体连接 (NetStream部分 1)