可能纯C++使用者会对消息映射产生疑问: 为什么Microsoft 不用虚拟函数来替代消
息映射?虚拟函数是MFC 中处理消息映射的标准C++方式,所以使用宏DECLARE_MESSAGE_MAP
和BEGIN_MESSAGE_MAP 可能有些怪异。
MFC 使用消息映射来解决虚拟函数的基本问题。参见MFC 帮助文件中的CWnd 类。它包
含200 多个成员函数,所有的成员函数当不使用消息映射时都是虚拟的。现在来看一下所
有CWnd 类的子类。MFC 中大约有近30 个类是以CWnd 为基类的。这包括所有的可见控制如
按钮、静态标签和列表。现在想象一下,MFC 使用虚拟函数,并且你建立一应用程序包含
有20 个控制。CWnd 中的200 个虚拟函数中的每个都需要自己的虚拟函数表,并且一个控
制的每个例程都应有一组200 个虚拟函数与之关联。则程序可能就有近4,000 个虚拟函数
表在内存中,这对内存有限的机器来说是个大问题。因为其中的大部分是不用的。
消息映射复制了虚拟函数表的操作,但是它是基于需要的基础之上的。当你在消息映
射中建立一个入口时,你是在对系统说,“当你看见一个特殊的消息时,请调用指定的函
数”。只有这些函数实际上被重载到消息映射中,着就节省了内存和CPU 的负担。
当你用DECLARE_MESSAGE_MAP 和BEGIN_MESSAGE_MAP 说明消息映射时,系统会通过你
的消息映射选择所有的消息。如果消息映射处理了给定的消息,则你的函数会被调用,卸
车也就停留在此。但是,如果你的消息映射中不包含某个消息的入口,则系统会把该消息
发送第二个BEGIN_MESSAGE_MAP 指定的类。那个类可能会也可能不会处理它,如此重复。
最后,如果没有消息映射处理一给定的消息,该消息会到由一缺省的处理函数来处理。
MFC消息映射(研究中)
最新推荐文章于 2023-12-21 00:19:00 发布