用消息映射处理消息循环
来源:岁月联盟
时间:2009-02-21
那么MFC是如何链接到这一事件的呢?它是通过消息映射来实现的。
在每个能处理消息的类中,定义一个消息和消息响应函数的静态对照表,叫做消息映射表;当有消息时,只需要查找该映射表,通过这个消息找到响应函数(一个函数指针),那么就调用了该消息处理函数。
Cwnd中有一个WindowProc函数,可以到WinCore.cpp中找到,它是一个虚函数。这一步涉及到较深的MFC源代码,有待进一步分析。
MFC为什么要这么设计呢? 一个消息可以通过一个个类层次向下传递从而找到这个响应函数,因为每个窗口都是用CWnd继承的,这个继承层次很深。那么这个层次中所有的类都加上消息处理函数, 每个子类都要重写这个响应函数,这是不可能的。从效率方面考虑,因为Cwnd中的WindowProc是一个虚函数,那么它的子类中都必须要维护一个虚函数表vtable,这个继承很深,无论子类是否重写这个虚函数,每个类都要有这个虚函数表,占用了大量的内存,严重影响了效率。
上一篇:成员函数和this指针
下一篇:sprintf函数详细介绍