MFC的MESSAGE_MAP

来源:互联网 发布:部落冲突法师数据 编辑:程序博客网 时间:2024/05/29 07:30

    MFC的消息处理机制用了三个宏来实现,首先是在头文件中定义DECLARE_MESSAGE_MAP,然后在实现文件中(.cpp)中定义BEGIN_MESSAGE_MAP(theClass, baseClass)和END_MEESAGE_MAP()。然后在这两个宏中间用一系列的宏来映射消息处理的函数,如ON_WM_PAINT()、ON_WM_CREATE()等等。

    仔细分析这几个宏的实现发现,其实完成的就是这样一件事情:消息传递。首先看自己的类有没有处理某一个消息,如果没有就去基类的消息映射表里面找有没有函数处理这个消息,以此类推,一直推到CCmdTarget类,如果还没有,就调用windows默认的处理函数处理。其实绕来绕去,搞得这么复杂,说白了就是MFC自己实现了虚函数的机制。这种东西完全可以用虚函数来实现,搞不懂MFC为什么要搞这么复杂,而现在我们用的SDK框架,也确实用了虚函数来做这些事情,看起来清楚明了多了,也更容易理解。

    《深入浅出MFC》里面给出的理由是为了节省内存,在第417页的下面有解释,说实话,我不认为搞这么能节省多少空间,每个类才一个虚表,就算一个工程有1000类要处理消息,需要处理的消息有1000种,在虚表上占用的内存也才4M而已(我应该没算错吧?)。当然,MFC出来的时候是什么年代,那个年代计算机的内存还比较小,这样想,当时的这样设计确实能够省不少空间,当然这是相对于大的应用软件来说的。

原创粉丝点击