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浏览器,浏览器 ...
随机推荐
- [LeetCode] Random Pick with Weight 根据权重随机取点
Given an array w of positive integers, where w[i] describes the weight of index i, write a function ...
- JavaBean,POJO,VO,DTO的区别和联系
JavaBean 是一种JAVA语言写成的可重用组件.为写成JavaBean,类必须是具体的和公共的,并且具有无参数的构造器.JavaBean 通过提供符合一致性设计模式的公共方法将内部域暴露成员属性 ...
- Jvm 中的 重排序、主存、原子操作
一.重排序 好处:重排序可以提升性能,避免在一个耗时很长的指令在“执行”阶段呆很长时间,而导致后续的指令都卡在“执行”之前的阶段上. 坏处:重排序对多线程的影响 class ReorderExampl ...
- css display:flex 属性
一:display:flex 布局 display:flex 是一种布局方式.它即可以应用于容器中,也可以应用于行内元素.是W3C提出的一种新的方案,可以简便.完整.响应式地实现各种页面布局.目前,它 ...
- Lambda查询
使用EF查询数据库,之前使用Linq表达式,现在改成另一个种方法查询:Lambda表达式 TestEntities db=new TestEntities(); ).FirstOrDefault(); ...
- 如何print 输出不换行(2 和 3 处理方式 不一样)
2.7 正常情况下print输出的时候会自动进行换行处理,我们肯定有时候会有输出不换行的需求, 下面开始介绍如何不换行输出: 例子: print("hello world") ...
- IDEA/Eclipse简易化使用的几个技巧
IDEA 易用性计较 代码自动提示,取消大小写限制 Ctrl+/生成的"//" 注释,不能跟代码块自动对齐 Eclipse 优化技巧目录 1.更改编码,统一全局的字体编码格式 2. ...
- Autofac之类型关联
前面的学习一直使用的是直接注册类型并不是Autofac已经依赖注入的主要使用方式,最佳的依赖注入与Autofac的使用方式,都是要结合面向接口(抽象)编程的概念的.推崇的是依赖于抽象而不是具体 pub ...
- 构建react项目失败解决办法
1.初始化项目,报下方错误 2.解决方法,更新淘宝镜像 npm config set registry https://registry.npm.taobao.org 3.在初始化项目 create- ...
- jquery 改变img的src
jQuery修改img的src的方法: $("#img_id").attr("src","new_src"); 此语句的功能是:修改id为i ...