[转载]WTL下重绘PopMenu再次做笔记

from: http://hi.baidu.com/zuikee/blog/item/bb639ec4e46774b98226acc9.html

 

    MFC下的倒是直接从CMenu下直接继承,重写DrawItem即可,下午为了在WTL下重绘弹出菜单纠结了很久。

起初,查看WTL里的CMenuT的源码,CMenuT居然是没有继承任何模板 , 其成员函数全部是封装的API,我不敢想象他能有DrawItem、MeasureItem的处理消息。我清晰的记得昨天的日志中写到COwnerDraw模板会支持CMenu的重载,于是我便还是尝试着从CWindowImpl<CMenuEx,CMenu> , public COwnerDraw 继承,再到主窗口去傻傻的等待DrawItem消息的反射,不管我是否加上了OWnerDraw风格,始终还是没等到他的到来。

后来在,CodeProject中看到此文:http://www.codeproject.com/KB/wtl/WTLOwnerDrawCtxtMenu.aspx

找到了方法:

1、准备一个宿主需要依赖的模板(CMenuEx) ,宿主需要依赖此模板:class COwnerDlg : public CMenuEx<COwnerDlg>

2 、 其中为HMenu增加MFT_OWNERDRAW属性的函数

3、宿主需要把消息链入该子模板类。

4、响应OnDrawItem OnMeasureItem 即可

大功告成~~

我先前尝试失败的问题在于,以为menu是一个独立的消息窗口,有自己内部的消息循环,于是自己继承CWindowImpl大搞特搞,结果以失败告终~~

其实他的消息应该来自于由宿主程序chain到menu里。^_^

 

posted @ 2011-03-07 11:37 MokLiu 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/satng/archive/2011/03/07/2138812.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值