DUILIB消息处理过程
DUILIB消息处理机制
方法一、
首先窗口基类创建 CWindowWnd->Create()
调用 CWindowWnd->RegisterWindowClass() 注册 CWindowWnd->__WndProc() 为本界面窗口消息处理函数
__WndProc()调用 虚函数 CWindowWnd->HandleMessage() 处理消息
WinImplBase继承 CWindowWnd 并重写了 HandleMessage()处理消息 该函数拦截 WM_CREATE 、WM_MOUSEMOVE等常见消息,并转发至 该类对应的虚函数 WinImplBase::OnCreate(),WinImplBase::OnMouseMove()等 ,
之后WinImplBase::HandleMessage()函数调用 该类虚方法 WinImplBase::HandleCustomMessage()
此时我们可以自己重写窗口的 HandleCustomMessage(),OnCreate(), OnMouseMove()等 方法进行消息过程处理
最后WinImplBase::HandleMessage()函数调用该类的成员CPaintManagerUI m_pm的MessageHandler()方法;
在m_pm的MessageHandler()方法中首先调用了LRESULT lResult = static_cast<IMessageFilterUI*>(m_aMessageFilters[i])->MessageHandler(uMsg, wParam, lParam, bHandled);
此时我们可以实现 IMessageFilterUI接口并调用CPaintManagerUI::AddPreMessageFilter() 添加到m_aMessageFilters过滤队列中,在IMessageFilterUI::MessageHandler(uMsg, wParam, lParam, bHandled);中处理消息
之后调用了 static_cast<INotifyUI*>(m_aNotifiers[j])->Notify(*pMsg);
此时我们可以实现INotifyUI,调用CPaintManagerUI::AddNotifier,将自身加入Notifier队列。
方法 二、
CPaintManagerUI::MessageLoop() 消息泵 调用 CPaintManagerUI::TranslateMessage(const LPMSG pMsg)来进行分发消息
该函数会调用 该类 PreMessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT& /*lRes*/)
之后在PreMessageHandler() 中调用 LRESULT lResult = static_cast<IMessageFilterUI*>(m_aPreMessageFilters[i])->MessageHandler(uMsg, wParam, lParam, bHandled);
此时我们可以实现IMessageFilterUI接口并调用CPaintManagerUI::AddPreMessageFilter() 过滤队列中,通过此方法可以 在窗口处理之前 先对消息进行预处理
DUILIB消息处理过程的更多相关文章
- live555学习之RTSP连接建立以及请求消息处理过程
1,RTSP连接的建立过程 RTSPServer类用于构建一个RTSP服务器,该类同时在其内部定义了一个RTSPClientSession类,用于处理单独的客户会话. 首先创建RTSP服务 ...
- live555_RTSP连接建立以及请求消息处理过程
1,RTSP连接的建立过程 RTSPServer类用于构建一个RTSP服务器,该类同时在其内部定义了一个RTSPClientSession类,用于处理单独的客户会话. 首先创建RTSP服务 ...
- wxWidgets源码分析(4) - 消息处理过程
目录 消息处理过程 消息如何到达wxWidgets Win32消息与wxWidgets消息的转换 菜单消息处理 消息处理链(基于wxEvtHandler) 消息处理链(基于wxWindow) 总结 消 ...
- DuiLib消息处理剖析
本来想自己写写duilib的消息机制来帮助duilib的新手朋友,不过今天发现已经有人写过了,而且写得很不错,把duilib的主干消息机制都说明了,我就直接转载过来了,原地址:http://blog. ...
- 深入delphi编程理解之消息(一)WINDOWS原生窗口编写及消息处理过程
通过以sdk方式编制windows窗口程序,对理解windows消息驱动机制和delphi消息编程有很大的帮助. sdk编制windows窗口程序的步骤: 1.对TWndClass对象进行赋值; 2. ...
- tomcat 解析(二)-消息处理过程
接下来我们应该去了解一下 tomcat 是如何处理jsp和servlet请求的. 1. 我们以一个具体的例子,来跟踪TOMCAT, 看看它是如何把Request一层一层地递交给下一个容器, 并最后交 ...
- DuiLib(四)——控件绘制
duilib的所有控件均绘制在唯一的真实窗口之中,本篇就具体看下这个绘制的过程.所有的绘制过程均在WM_PAINT消息处理过程中完成.由窗口及消息篇可以看到,窗口消息处理最终流到了CPaintMana ...
- duilib之源码分析
<duilib之源码分析>1 stdAfx.h * lengthof(x) 计算数组长度宏 * MAX 两值最大 * MIN 两值最小 * CLAMP(x,a,b) x在a,b之间则取 ...
- 解决Duilib集成CEF浏览器在Win10无法向客户区拖拽文件
在Duilib中集成CEF浏览器项目实际开发中,遇到一个问题. 一个需求从资源管理器(桌面)拖拽文件到客户端,窗口捕获WM_DROPFILES消息然后进行消息处理,但客户区是集成的CEF浏览器,浏览器 ...
随机推荐
- hdfs directory item limit - (dfs.namenode.fs-limits.max-directory-items)
// :: WARN scheduler.TaskSetManager: Lost task , emr-worker-.cluster-, executor ): org.apache.hadoop ...
- CodeForces #549 Div.2 D. The Beatles
题目 解题思路 关键是要 ,找出L 的组合,然后遍历L的组合,用最大公约数就可以算出来当前L的值要停多少次 怎么找出L的组合呢?饭店是每隔K 有一个,是重复的,我们只需要算出第一个饭店两侧,起点和停顿 ...
- Python全栈-magedu-2018-笔记1
第一章 - Python 环境搭建 操作系统准备 准备Linux最小系统即可. 如果在虚拟机中克隆,MAC地址会变. 这里使用CentOS 6.5+ Pyenv 安装 安装git yum instal ...
- Collections类
1:一个类对象之间的比较两种方法 1)实现Comparator<String>类并且从写Comparator类中的compare方法, public class A implements ...
- 邮件服务器安装--Postfix + Dovecot + Squirrelmail--CentOS 6.4
英文原文链接 : http://www.unixmen.com/install-postfix-mail-server-with-dovecot-and-squirrelmail-on-centos- ...
- lambada表达式
在Java 8中stream().map(),您可以将对象映射为其他对象. List<String> collect = alpha.stream().map(String::toUppe ...
- Nginx(三)-正向代理与反向代理
原文:正向代理与反向代理的区别 正向代理中,proxy和client同属一个LAN,对server透明: 反向代理中,proxy和server同属一个LAN,对client透明. 实际上proxy在两 ...
- Mybatis+Mysql逆向工程
目录结构: pom文件: <?xml version="1.0" encoding="UTF-8"?> <project xmlns=&quo ...
- 匹配字符串中的s开头的单词,并替换
String s="now it's sping,but today is so cold!"; String a=s.replaceAll("s\\w+",& ...
- Vue学习记录第一天
今天开始了Vue的学习,下面我就记录一下学习了什么. 1.什么是Vue? vue是一套基于javaScript的渐进式框架,是MVVM框架.View ——ViewModel——Model 其中Vie ...