精通
英语
和
开源
,
擅长
开发
与
培训
,
胸怀四海
第一信赖
锐英源精品原创,禁止转载和任何形式的非法内容使用,违者必究
从以往的经验,按面向对象框架来理解消息为一个框架接口,对于处理消息路由,可以在基类中针对每种消息定义一个接口虚函数。当子类需要对某个消息进行处理时,只需要重写基类相应的虚函数即可,通过这种方式就可以完成消息的路由。
这样做从原理上讲是没有问题的,但是从编程角度讲,是不可取的。为什么不可取?因为虚函数必须由一个虚函数表(vtable)来实现。在应用程序中使用的每个派生类,系统都要为它们分配一个vtable,并且不管基类中虚函数是否确实在派生类中被重写,这个vtable表中都要为基类的每一个虚函数提供一个 4字节的输入项。而我们知道,MFC中类的派生层次很多,这样做,将使MFC类及其派生类背着一个很大的虚拟函数表的包袱,这对内存资源是一种浪费。而且,每次扫描虚拟函数表也是非常消耗时间的操作,这种定义虚拟函数的做法显然是不合适的。所以MFC没有采用虚拟函数这种机制,而是采用一种称之为消息映射的机制来完成消息路由。
MFC消息映射机制的具体实现方法是:在每个能接收和处理消息的类中,定义一个消息和消息函数静态对照表,即消息映射表。在消息映射表中,消息与对应的消息处理函数指针是成对出现的。某个类能处理的所有消息及其对应的消息处理函数的地址都列在这个类所对应的静态表中。当有消息需要处理时,程序只要搜索该消息静态表,查看表中是否含有该消息,就可知道该类能否处理此消息。如果能处理该消息,则同样依照静态表能很容易找到并调用对应的消息处理函数。