现在的位置: 首页 > 综合 > 正文

wtl 自绘

2012年12月15日 ⁄ 综合 ⁄ 共 1013字 ⁄ 字号 评论关闭

WTL for MFC Programmers 在vcbase 翻译城中中文

在codeproject中有原文,并且可以下载到源代码http://www.codeproject.com/KB/wtl/wtl4mfc5.aspx

 

 

 

REFLECT_NOTIFICATIONS() //消息反射必须添加

 

 

了ATL的消息反射(Message Reflection)机制。所谓消息反射,就是指窗口类在收到消息时可以将消息反传回去给发出消息的窗口类。比如对于一个自画样式的按钮,它会发出WM_DRAWITEM消息通知父窗口,而父窗口并不处理这个消息而是将它反传回去,让按钮自己处理。显而易见,这种机制更符合面向对象的要求,减少了按钮和父窗口之间的依赖关系。

 

被父窗口返回的消息代号都是以OCM开头,当我们在父窗口的消息映射表中加入一条REFLECT_NOTIFICATIONS()宏时,父窗口就能够将支持消息反射的控件所发出的消息反传回去,如果控件类或其父类(前提是已经做了基类链接)的消息映射表中有相应消息的反射处理宏,那么控件就会在自己或父类的消息响应函数中处理这条消息。下面让我们来看一看消息分割及反射的具体实现方法。首先在CownerDrawButton的消息映射表中加入如下宏:

CHAIN_MSG_MAP_ALT(COwnerDraw<CownerDrawButton>,1)

  然后在框架类的消息映射表中加入REFLECT_NOTIFICATIONS()宏,这样就完成了消息映射。但是需要注意的是,REFLECT_NOTIFICATIONS必须放在消息映射表的最后,否则所有通知消息都将被返回,窗口本身得不任何通知消息,如果你在REFLECT_NOTIFICATIONS宏后面添加一条COMMAND_HANDLER(IDC_BUTTON1, BN_CLICKED, OnClickedButton1) ,那么OnClickedButton1是永远也不会被触发的。当按钮发出WM_DRAWITEM消息时,框架类接到后,先检查自己的消息映射表里是否有相对应的消息处理函数,如果没有那么REFLECT_NOTIFICATIONS就将消息反回给按钮,按钮在消息映射表中找到MESSAGE_HANDLER(OCM_DRAWITEM,OnDrawItem)这一项,宏会将消息映射到OnDrawItem函数,通过调用OnDrawItem函数,完成绘制工作

抱歉!评论已关闭.