Chinaunix首页 | 论坛 | 博客
  • 博客访问: 14497509
  • 博文数量: 5645
  • 博客积分: 9880
  • 博客等级: 中将
  • 技术积分: 68081
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-28 13:35
文章分类

全部博文(5645)

文章存档

2008年(5645)

我的朋友

分类:

2008-04-28 20:54:46

下载本文示例代码
  什么是消息反射?  在Windows里面,子控件经常向父控件发送消息,例如很多子控件要绘制自己的背景,就可能向父窗口发送消息WM_CTLCOLOR。对于从子控件发来的消息,父控件有可能在处理之前,把消息返还给子控件处理,这样消息看起来就想是从父窗口反射回来一样,故此得名:消息反射。   消息反射的由来  在Windows和MFC4.0版本一下,父窗口(通常是一个对话框)会对这些消息进行处理,换句话说,自控件的这些消息处理必须在父窗口类体内,每当我们添加子控件的时候,就要在父窗口类中复制这些代码,我们可以想象这是多么的复杂,代码是多么的臃肿!  我们可以想象,如果这些消息都让父窗口类去做,父窗口就成了一个万能的神,一个臃肿不堪的代码机,无论如何消息的处理都集中在父窗口类中,会使父窗口繁重无比,但是子控件却无事可做,并且代码也无法重用,这对于一个程序员来讲是多么痛苦的一件事?!  在老版本的MFC中,设计者也意识到了这个问题,他们对一些消息采用了虚拟机制,例如:WM_DRAWITEM,这样子控件就有机会控制自己的动作,代码的可重用性有了一定的提高,但是这还没有达到大部分人的要求,所以在高版本的MFC中,提出了一种更方便的机制:消息反射。  通过消息反射机制,子控件窗口便能够自行处理与自身相关的一些消息,增强了封装性,同时也提高了子控件窗口类的可重用性。不过需要注意的是:消息反射是MFC实现的,不是windows实现的;要让你的消息反射机制工作,你得类必须从CWnd类派生。   Message-Map中的处理  如果想要处理消息反射,必须了解相应的Message-Map宏和函数原型。一般来讲,Message-Map是有一定的规律的,通常她在消息的前面加上一个ON_ ,然后再消息的最后加上 _REFLECT。例如我们前面提到的WM_CTLCOLOR 经过处理后变成了ON_WM_CTLCOLOR_REFLECT;WM_MEASUREITEM则变成了ON_WM_MEASUREITEM_REFLECT。  凡事总会有例外,这里也是这样,这里面有3个例外:  (1) WM_COMMAND 转换成 ON_CONTROL_REFLECT;  (2) WM_NOTIFY 转换成 ON_NOTIFY_REFLECT;  (3) ON_UPDATE_COMMAND_UI 转换成 ON_UPDATE_COMMAND_UI_REFLECT;  对于函数原型,也必须是以 afx_msg 开头。   利用ClassWizard添加消息反射  (1)在ClassWizard中,打开选择项Message Maps;  (2)在下拉列表Class name中选择你要控制的类;  (3)在Object IDs中,选中相应的类名;  (4)在Messages一栏中找到前面带有=标记的消息,那就是反射消息;  (5)双击鼠标或者单击添加按钮,然后OK! 共2页。 1 2 :   什么是消息反射?  在Windows里面,子控件经常向父控件发送消息,例如很多子控件要绘制自己的背景,就可能向父窗口发送消息WM_CTLCOLOR。对于从子控件发来的消息,父控件有可能在处理之前,把消息返还给子控件处理,这样消息看起来就想是从父窗口反射回来一样,故此得名:消息反射。   消息反射的由来  在Windows和MFC4.0版本一下,父窗口(通常是一个对话框)会对这些消息进行处理,换句话说,自控件的这些消息处理必须在父窗口类体内,每当我们添加子控件的时候,就要在父窗口类中复制这些代码,我们可以想象这是多么的复杂,代码是多么的臃肿!  我们可以想象,如果这些消息都让父窗口类去做,父窗口就成了一个万能的神,一个臃肿不堪的代码机,无论如何消息的处理都集中在父窗口类中,会使父窗口繁重无比,但是子控件却无事可做,并且代码也无法重用,这对于一个程序员来讲是多么痛苦的一件事?!  在老版本的MFC中,设计者也意识到了这个问题,他们对一些消息采用了虚拟机制,例如:WM_DRAWITEM,这样子控件就有机会控制自己的动作,代码的可重用性有了一定的提高,但是这还没有达到大部分人的要求,所以在高版本的MFC中,提出了一种更方便的机制:消息反射。  通过消息反射机制,子控件窗口便能够自行处理与自身相关的一些消息,增强了封装性,同时也提高了子控件窗口类的可重用性。不过需要注意的是:消息反射是MFC实现的,不是windows实现的;要让你的消息反射机制工作,你得类必须从CWnd类派生。   Message-Map中的处理  如果想要处理消息反射,必须了解相应的Message-Map宏和函数原型。一般来讲,Message-Map是有一定的规律的,通常她在消息的前面加上一个ON_ ,然后再消息的最后加上 _REFLECT。例如我们前面提到的WM_CTLCOLOR 经过处理后变成了ON_WM_CTLCOLOR_REFLECT;WM_MEASUREITEM则变成了ON_WM_MEASUREITEM_REFLECT。  凡事总会有例外,这里也是这样,这里面有3个例外:  (1) WM_COMMAND 转换成 ON_CONTROL_REFLECT;  (2) WM_NOTIFY 转换成 ON_NOTIFY_REFLECT;  (3) ON_UPDATE_COMMAND_UI 转换成 ON_UPDATE_COMMAND_UI_REFLECT;  对于函数原型,也必须是以 afx_msg 开头。   利用ClassWizard添加消息反射  (1)在ClassWizard中,打开选择项Message Maps;  (2)在下拉列表Class name中选择你要控制的类;  (3)在Object IDs中,选中相应的类名;  (4)在Messages一栏中找到前面带有=标记的消息,那就是反射消息;  (5)双击鼠标或者单击添加按钮,然后OK! 共2页。 1 2 : 下载本文示例代码


深度剖析消息反射机制深度剖析消息反射机制深度剖析消息反射机制深度剖析消息反射机制深度剖析消息反射机制深度剖析消息反射机制深度剖析消息反射机制深度剖析消息反射机制深度剖析消息反射机制深度剖析消息反射机制深度剖析消息反射机制深度剖析消息反射机制深度剖析消息反射机制深度剖析消息反射机制深度剖析消息反射机制
阅读(285) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~