用消息映射处理消息循环

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

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

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

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

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

图片内容