WTL 中的COwnerDraw应用

COwnerDraw是WTL为用户提供为自画和定制外观控件的模板类,最近被这个类搞的晕头转向,其实关键的东西也只是那么一点点.
<wbr><wbr><wbr><wbr>自画需要响应四个消息:WM_MEASUREITEM, WM_DRAWITEM, WM_COMPAREITEM, 和WM_DELETEITEM,在atlframe.h头文件中定义的COwnerDraw类可以简化这些工作,使用这个类就不需要处理这四个消息,你只需将消息链入COwnerDraw,它会调用你的类中的重载函数。</wbr></wbr></wbr></wbr>
<wbr><wbr><wbr>如何将消息链入COwnerDraw取决与你是否将消息反射给控件,两种方法有些不同。</wbr></wbr></wbr>
<wbr></wbr>
<wbr><wbr><wbr>CHAIN_MSG_MAP(COwnerDraw&lt;CSomeDlg&gt;)</wbr></wbr></wbr>
<wbr><wbr><wbr>上面这种直接将消息链入COwnerDraw</wbr></wbr></wbr>
<wbr><wbr><wbr>CHAIN_MSG_MAP_ALT(COwnerDraw&lt;CSomeButtonImpl&gt;,<span class="cpp-literal" style="word-wrap:normal; word-break:normal; line-height:21px">1</span>)<br><wbr><wbr><wbr>DEFAULT_REFLECTION_HANDLER()</wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><wbr><wbr>如果你想要控件自己处理这些消息,你需要使用CHAIN_MSG_MAP_ALT宏将消息链入ALT_MSG_MAP(1)部分,如上.</wbr></wbr></wbr>
<wbr><wbr><wbr><wbr>上面这些网上的教程都有.下面我要说的就是教程里没有的(太简单了,应该属于常识,人家的教程就没写进去,一致于像我这样的菜鸟搞了很长的时间,希望能帮助和我一样的菜鸟,呵呵)</wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr>首先,想要把你自己实现个控件类和资源编辑器中的控件联系起来,你不光要做的是 attach()(用这个关联有问题,原因还不知道)和<span style="font-family:宋体; word-wrap:normal; word-break:normal; line-height:21px">SubclassWindow(),你还得必须把你控件的属性中的Owner Draw的属性设为true,才能和你控件关联起来,做了例子试试吧!(是不是太简单了,我用了两天时间才发现的).</span></wbr></wbr></wbr></wbr>
<wbr><wbr><wbr>第二个关键,现在的运行程序发现Owner Draw的属性为true的控件都显示不出来,一个原因是你重载的<span style="font-family:宋体; word-wrap:normal; word-break:normal; line-height:21px">DrawItem(LPDRAWITEMSTRUCT lpdis)函数是个空函数,一般情况下如果你要自画控件是应该在这里用gdi画的,可是你发现你已经把所要花的内容写好了,还是看不见.原因是我们的程序缺少一个宏</span><wbr><wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><span style="font-family:宋体; word-wrap:normal; word-break:normal; line-height:21px">BEGIN_MSG_MAP(CMainDlg)<br><wbr><wbr><wbr><wbr>REFLECT_NOTIFICATIONS()(<span style="color:#FF0000; word-wrap:normal; word-break:normal; line-height:21px">少了这个宏</span>)<br><wbr>END_MSG_MAP()</wbr></wbr></wbr></wbr></wbr></span><wbr></wbr></wbr>
这是这个宏的全貌
#define REFLECT_NOTIFICATIONS() \
<wbr>{ \<br><wbr><wbr>bHandled = TRUE; \<br><wbr><wbr>lResult = ReflectNotifications(uMsg, wParam, lParam, bHandled); \<br><wbr><wbr>if(bHandled) \<br><wbr><wbr><wbr>return TRUE; \<br><wbr>}</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr></wbr>
这个宏调用的是函数 CWindowImplRoot::ReflectNotifications。这个函数通过参数取得发送事件控件的窗体句柄,并通过该句柄将事件发还给控件.
最后还有一点不是所有的控件都可以用COwnerDraw来自绘控件的,只有5个控件(MENU,LISTBOX,COMBOBOX,BUTTON,STATIC)支持.
呵呵,就是这样.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值