用消息映射处理消息循环

     为一个vc程序添加一个事件,那么平台会自动生成时间处理的函数,我们只需要在里面加代码就可以了。比如添加WM_LButtondown大家都知道windows程序是事件驱动,每一个事件都需要一个函数来与之对应,也就是通过消息循环在消息队列中来检测事件,然后通过回调函数来处理这一事件。

    那么MFC是如何链接到这一事件的呢?它是通过消息映射来实现的。

    在每个能处理消息的类中,定义一个消息和消息响应函数的静态对照表,叫做消息映射表;当有消息时,只需要查找该映射表,通过这个消息找到响应函数(一个函数指针),那么就调用了该消息处理函数。

    Cwnd中有一个WindowProc函数,可以到WinCore.cpp中找到,它是一个虚函数。这一步涉及到较深的MFC源代码,有待进一步分析。

    MFC为什么要这么设计呢? 一个消息可以通过一个个类层次向下传递从而找到这个响应函数,因为每个窗口都是用CWnd继承的,这个继承层次很深。那么这个层次中所有的类都加上消息处理函数, 每个子类都要重写这个响应函数,这是不可能的。从效率方面考虑,因为Cwnd中的WindowProc是一个虚函数,那么它的子类中都必须要维护一个虚函数表vtable,这个继承很深,无论子类是否重写这个虚函数,每个类都要有这个虚函数表,占用了大量的内存,严重影响了效率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值