最终想要的界面效果如图中所示,整个对话框背景颜色可变,Tab选项卡背景颜色可变,Button的背景颜色可变。实际上Tab control包含四部分:标签、标签文字、标签文字背景、选项卡背景,四部分的颜色均可DIY。对于Button,同理。但对于两种控件,要想DIY控件背景颜色,相同点是必须开“自绘属性”,不同点是自绘的方式不同,所谓殊途同归。可在重绘两种控件的漫长岁月里,真的对MFC的界面编辑功能无力吐槽,简直是寸步难行,说不定哪个断点处就会“断言失败”,MFC这种东西还是要从最底层的类学起,起码能知道检索MSDN中的哪一项。
资源链接:点击打开链接 http://download.csdn.net/download/qq_15522447/10273331
言归正传。。。。。。。。。。。。。。。。。。。。。。。
LZ 的开发环境是win7,vs2010.
控件自绘:MFC中规定,部分控件自绘使用OnDrawItem()函数,另一部分使用DrawItem()函数;这是MFC界面操作中的一个鸡肋,这就会有可能导致当使用OnDrawItem()自绘的控件与使用DrawItem()自绘的控件需要共存时,可能会产生不可预知的问题,实际上是预知的。当主窗口添加了OnDrawItem()详细映射,同时在派生类中重载DrawItem()时,编译通过,但DrawItem()中的代码不完整执行,具体什么效果见下文。
(一)Tab的自绘,关键点有二:(1)设置控件自绘属性(2)重载DrawItem()函数。
STEP1:控件属性 Owner Draw Fixed --> TRUE Style --> Fixed Width 控件属性再找不到,面壁!
STEP2:派生CTabCtrl类
重载DrawItem()函数。
派生类中,添加OnEraseBkgnd()消息处理函数。派生类中头文件、cpp文件中的代码
调用时,只需在主窗口中声明类,在OnInitDialog()函数中添加下图中代码即可:
效果为
(二)Button自绘
button自绘网上的教程比较多,这里就不再赘述,主窗口类中添加OnDrawItem()函数即可,直接上代码截图,别忘了,设置Button控件的自绘属性!
OK,难点来了,若是想要两种自绘控件共存呢?
先上两张失败的图片吧。
若将上述两种自绘的代码强行结合在一起,就会出现上图右中的效果,效果是出来了,但是却激发了断点,跟踪断点最后定位到user32.dll上,具体是啥实在是弄不懂。于是尝试关掉Tab的自绘,出现了左图中的效果。
经过几番摸索,大致明白了OnDrawItem与DrawItem的作用原理,若两者共存,两者均会执行,但是两者会有一个执行顺序,这也就是上述红色文字的由来。两者的共同点就是,在实行函数体的时候都会对窗口进行重绘,而两者重绘的内容是有区别的。DrawItem只负责Tab中四个部分中再重绘,OnDrawItem负责整个窗口的重绘,但是OnDrawItem重绘时遗漏了对Tab中标签文字、标签文字背景、标签的重绘。所以,只需在OnDrawItem中添加上该部分即可。
代码如下图。