CEdit重绘的方法,我要自定义皮肤效果,不要简单换色

CEdit控件如果需要加入皮肤,方法有很多种,网络上最常见的是重载父类的WM_CTLCOLOR,设置CDC的背景色、文字颜色,但是这种实现有很多硬伤:

1.OnCtlColor里面的诡异判定逻辑:在该函数参数中nCtlColor指定了控件的类型,一般默认的方法是建议大家根据这个类型来对不同的控件进行处理,但是这个参数在在绘制逻辑上, 把具有ReadOnly或Disable的Edit归到了CTLCOLOR_STATIC,而其他可以编辑的Edit归类到CTLCOLOR_EDIT,因此要同时处理可以编辑的Edit、不可编辑的Edit、Static三种控件的现实的时候,特别是这3中控件都有各自的效果的时候,问题就乱了套了……

这时候,一个应急的方案是对OnCtlColor的第二个参数CWnd* pWnd对每一个控件GetClassName,然后这么判断每一个控件的类型,光看这个逻辑,就知道这么做不合适,虽然也可以明确的区分Edit和Static……

2.OnCtlColor工作在Client绘制区,碰到一个边框也有要求的,就没有办法了

3.没有对象抽象的概念,如果我在一个界面中有多种风格的CEdit控件,就要按照控件ID,逐一的处理

总之,通过OnCtlColor绘制的Edit代码没有复用性,没有可维护性,代码效率确低

 

解决方案:重载CEdit,在CEdit处理“=WM_CTLCOLOR” + “WM_NCPAINT”

强调“= WM_CTLCOLOR”是消息反射的,是WM_NCPAINT而不是WM_PAINT!

最简单的绘制,把这两个函数写好了,皮肤Edit也就可以出来了

 

时间不早了,明天写详细实现,我再弄一个实例工程

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值