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也就可以出来了
时间不早了,明天写详细实现,我再弄一个实例工程