MFC消息映射(研究中)

可能纯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 指定的类。那个类可能会也可能不会处理它,如此重复。
最后,如果没有消息映射处理一给定的消息,该消息会到由一缺省的处理函数来处理。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值