MFC中的消息映射宏

MFC中的消息映射宏是用一系列的宏实现的,声明使用的MESSAGE_MAP_DECLARE (),开始部分用MESSAGE_MAP_BEGIN (),结束部分用MESSAGE_MAP_END (),中间的映射用MESSAGE (*,*)来实现.

        以前我一直搞不明白,说实话还是沉不下心来研究其中宏的具体含义.候捷的<MFC深入浅出>讲的很详细,其中还有对MFC的简易模拟实现,不过还是直到昨天看了段源码才真正明白了其中原理.

        首先,MFC的消息映射采用的数据结构就是一个二维数组

typedef struct _MSGMAP_ENTRY
{
UINT nMessage;           //消息ID
void (Wnd::*pfn)();        //函数指针
}MSGMAP_ENTRY;

        然后呢就可以声明一个MSGMAP_ENTRY类型的成员变量MSGMAP_ENTRY MessageEntry[];

其实这也就是MESSAGE_MAP_BEGIN的内容:

#define MESSAGE_MAP_BEGIN(ClassName) /
MSGMAP_ENTRY Wnd::MessageEntry[] = /
{

       很明显下面就是要为数组赋值

#define MESSAGE(MSG, PEOC) /
{MSG, &PEOC},

MESSAGE(*,*)的作用就是在二维数组中添加一项

       结束时调用MESSAGE_MAP_END ()

#define MESSAGE_MAP_END() /
{0, 0} /
};

即以0项结束,即ID为0,指针为NULL的项.

        有了这个二维数组,只需要在消息循环的处理函数中

int count = 0;
   while((MessageEntry[count].pfn) != 0)
   {
    if(MessageEntry[count].nMessage == nMsg)
    {
     (this->*MessageEntry[count].pfn)();
     return 0;
    }
    count++;
   }

即实现了消息映射,即对于特定ID调用相应的函数.

        现在似乎不提倡使用宏,说会让代码不直观,而且增加调试难度.确实是这样,不过宏的优势是显而易见的.假如上面的功能不用宏,就需要在所有窗口类的基类中为所有的消息构造虚拟函数,性能肯定可以和JAVA比一下了,而宏则对性能无任何影响,这应该也是MFC中采用宏,而非用所谓"面向对象"来设计的原因.

 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值