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也就可以出来了

 

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

 

没有更多推荐了,返回首页