消息路由 以及 消息映射与虚函数实现的分析

win32 实现一个应用程序:

设计  注册  创建 显示 更新  消息循环

消息: 操作系统将每个事件都包装成一个称为消息的结构体MSG来传递给应用程序。

MFC 类库把功能封装成类,然后把许多全局函数制作成文件在链接过程中链接到程序中,完成整个程序的链接...

所以,MFC程序的入口函数是WinMain函数。

CWinApp  theApp;//代表应用程序本身... 全程序有且只有一个theApp对象.

________________________________________________

消息处理及路由分析

程序在后台维护着一个c++资源的句柄和类对象的映射表。。

当有消息到来时,编译器会通过映射表把消息和相应的类关联,通过消息循环最终调用WindowProc函数,对消息处理。。。实现OnCmdMsg实现消息处理

每个类都会有一个如下的消息关联表(消息与处理函数的关联表) 。于是,就遍历其关联表找到处理函数执行。如果没有找到,那么就牵涉到消息路由的问题。

消息处理:

BEGIN_MESSAGE_MAP

END_MESSAGE_MAP

消息路由:

OnCmdMsg的处理过程分析:

系统把消息分为三类:1、标准消息(WM_CREATE、WM_DRAW等等);2、命令消息(也就是菜单消息);3、通告消息(WM_Notify);

a、处理标准消息时,如果不能在关联类中找到处理函数,那么只会在其基类中去路由。路由顺序:CView-->CFrameWnd-->CCmdTarget

b、处理命令消息时,路由顺序:CView -->CDocument-->CFrameWnd-->CWinApp-->CCmdTarget

__________________________________________________

消息映射与虚函数实现的分析

为什么没有用虚函数实现消息映射,而用消息宏实现消息映射?

1、侯捷所言:内存的消耗考虑;

2、可扩展性的考虑,因为以后如果有新的消息加入,那么需要修改类库源码,而这个宏机制实现就不存在这个问题;

3、管理的考虑。如果用虚函数实现,那么需要为每个类添加其所有的消息响应函数,但是实际上程序中每次只需要用到许多消息中的少几种消息即可,这样虚函数实现会存在大量的浪费问题,而宏机制实现就不在这个问题。

参考链接:http://blog.csdn.net/zdl1016/article/details/4813193

 

 

 

转载于:https://www.cnblogs.com/xuxu8511/archive/2012/04/17/2454067.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值