文档章节

Dulib源码浅析<二>之消息路由

书香神
 书香神
发布于 2018/11/03 17:58
字数 705
阅读 73
收藏 1

1. 消息入口

窗口过程是在注册窗口类中绑定的,我们找到注册窗口类的代码,如下:


bool CWindowWnd::RegisterWindowClass()

{

WNDCLASS wc = { 0 };

wc.style = GetClassStyle();

wc.cbClsExtra = 0;

wc.cbWndExtra = 0;

wc.hIcon = NULL;

wc.lpfnWndProc = CWindowWnd::__WndProc;

wc.hInstance = CPaintManagerUI::GetInstance();

wc.hCursor = ::LoadCursor(NULL, IDC_ARROW);

wc.hbrBackground = NULL;

wc.lpszMenuName = NULL;

wc.lpszClassName = GetWindowClassName();

ATOM ret = ::RegisterClass(&wc);

ASSERT(ret!=NULL || ::GetLastError()==ERROR\_CLASS\_ALREADY_EXISTS);

return ret != NULL || ::GetLastError() == ERROR\_CLASS\_ALREADY_EXISTS;

}

即绑定了窗口过程"CWindowWnd::__WndProc",跟进这个函数看看,这里截取关键代码:

return pThis->HandleMessage(uMsg, wParam, lParam);

这里的pThis是CWindowWnd的对象,起始指向的是子类"C360SafeFrameWnd",即我们自己定义的主窗口类,是在函数"CWindowWnd::Create"中在调用"CreateWindowEx"通过最后一个参数传进来的。那么通过这一步,就把消息通过函数"HandleMessage”传进了UI层,这是个虚函数,最终进入到C360SafeFrameWnd::HandleMessage()函数。好了,到这里就已经将windows窗口消息和我们自己的窗口类联系起来了,消息已经进入了我们的窗口类了,现在你可以在函数"HandleMessage"中处理消息响应。

整理下上面的流程:

WinMain()-->

pFrame->Create()-->

CWindowWnd::Create()-->

CWindowWnd::RegisterWindowClass()-->

CWindowWnd::__WndProc()-->

C360SafeFrameWnd::HandleMessage()-->

2.控件消息

消息如何进入控件的呢?在xml中配置了一个Buttom,点击这个按钮,按钮是如何捕捉到消息的呢?下面接着分析。

(1) UI管理器CPaintManagerUI

在主窗口"C360SafeFrameWnd"中定义了一个成员变量"CPaintManagerUI m_pm",顾名思义就叫它UI管理器,管理UI消息。

消息入口这一节中,我们看到消息路由到了函数"HandleMessage",接着看这个函数,可以看到有下面的调用:

*if( m_pm.MessageHandler(uMsg, wParam, lParam, lRes) ) return lRes;*

即将消息传入进了UI管理器"CPaintManagerUI::MessageHandler",这里管理所有的UI消息,然后将相应的消息传递给对应的控件,这里就解释了开头的疑问,消息是如何传递到UI控件的。

(2) 消息通知监听

在OnCreate函数中添加事件监听m_pm.AddNotifier(this);


bool CPaintManagerUI::AddNotifier(INotifyUI* pNotifier)

{

if (pNotifier == NULL) return false;

ASSERT(m_aNotifiers.Find(pNotifier)<0);

return m_aNotifiers.Add(pNotifier);

}

分发消息通知*CPaintManagerUI::SendNotify*,向添加了监听的窗口发送消息通知。

(3) 通知处理

重写虚函数*Notify*,在这里接收消息事件,处理自己的消息事件。

以单击按钮为例,看看是如何流程:

CPaintManagerUI::MessageHandler-->

pClick->Event--> 分发事件

CControlUI::Event-->

CButtonUI::DoEvent--> 响应事件

CButtonUI::Activate-->

CPaintManagerUI::SendNotify-->

CPaintManagerUI::SendNotify--> 分发消息通知

C360SafeFrameWnd::Notify--> 响应消息通知

基础教程推荐

最后推荐个系列基础入门教程,以前看过,新手再适合不过了,[http://www.cnblogs.com/Alberl/]

© 著作权归作者所有

书香神
粉丝 0
博文 4
码字总数 4658
作品 0
深圳
程序员
私信 提问
分布式消息中间件 RocketMQ:概述与源码编译篇

一、前言 Apache RocketMQ 是一个分布式消息中间件,其具有低延迟、高性能和可靠性、万亿级容量、灵活的可扩展性特性;它是阿里巴巴在2012年开源的分布式消息中间件,目前已经捐赠给 Apache...

阿里加多
2018/07/21
0
0
React-router4(新版)源码浅析

前言 router作为当前盛行的单页面应用必不可少的部分,今天我们就以React-Router V4为例,来解开他的神秘面纱。本文并不专注于讲解 Reacr-Router V4 的基础概念,可以前往官方文档了解更多基...

Kevin .ᘜ
2018/12/21
0
0
kafka学习笔记:知识点整理(一)

一、kafka 架构 1.1 拓扑结构 如下图: 图.1 1.2 相关概念 如图.1中,kafka 相关名词解释如下: 1.producer:  消息生产者,发布消息到 kafka 集群的终端或服务。2.broker:  kafka 集群...

愉快的鱼儿
2017/06/05
0
0
react-router 源码浅析

用 react-router 也用了比较久了,对他的内部工作方式却只是了解皮毛,而且大部分还是通过别人的博客。最近两周打算自己探究一下他的实现。 注意!因为我只使用过 v3 版本的 react-router,因...

刘zx
2018/06/09
0
0
我对java String的理解 及 源码浅析

摘要: 摘要: 原创出处: http://www.cnblogs.com/Alandre/ 泥沙砖瓦浆木匠 希望转载,保留摘要,谢谢! 每天起床告诉自己,自己的目标是 ”技术 + 英语 还有生活“! -泥沙砖瓦浆木匠 一.char...

泥沙砖瓦浆木匠
2014/08/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

零基础学画画应该从哪开始?

零基础学画画应该从哪开始?一种是从小有兴趣,喜欢涂鸦,喜欢将自己的创意和想法表现出来;另一种是长大后审美提高,开始对绘画艺术感兴趣,从而开始从零基础学起。 推荐大家可以搜一下:轻微...

设绘嗨
35分钟前
4
0
你编写的程序高效、优雅吗?阿里架构师教你编写高效优雅Java程序

面向对象 构造器参数太多怎么办? 用 builder 模式,用在 1、5 个或者 5 个以上的成员变量 2、参数不多,但是在未来,参数会增加 Builder 模式: 属于对象的创建模式,一般有 1. 抽象建造者:...

kx33389
39分钟前
3
0
PDF 文档操作Java类库Spire.PDF for Java v2.7.6发布上线!| 附下载

Spire.PDF for Java是一款专门对 PDF 文档进行操作的 Java 类库。该类库的主要功能在于帮助开发人员在 Java 应用程序(J2SE和J2EE)中生成 PDF 文档和操作现有 PDF 文档,并且运行环境无需安...

mnrssj
48分钟前
2
0
初探云原生应用管理(二): 为什么你必须尽快转向 Helm v3

在研究了一番“开放云原生应用中心(AppHub)”之后,程序员小张似乎已经明白了“云原生应用”到底是怎么一回事情。 “不就是 Helm 嘛!” 这不,小张这就准备把自己开发多年的“图书馆管理系...

zhaowei121
51分钟前
1
0
「工具」三分钟了解一款思维导图工具:XMind Zen

一款非常实用的商业思维导图软件,融合艺术与创造力。致力于高效的可视化思维,强调软件的跨平台使用,帮助用户提高生产效率。 相关信息 · 操作系统:macOS / Windows / Linux · 官方网站:...

极光推送
53分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部