当前位置:C++技术网 > 精选软件 > 4种控件自绘技术(修改颜色、用户自绘、拥有者自绘和子类化)的对比分析

4种控件自绘技术(修改颜色、用户自绘、拥有者自绘和子类化)的对比分析

更新时间:2016-02-22 23:12:00浏览次数:1+次

    控件自绘技术,在开发中非常有用。我相信还是有很多人都搞不清楚。自绘技术深似海,我且边学边看。虽然找到了一点方向,但是实际还没有完全掌握。在网上查阅了很多资料,不是说不清楚就是擦边,或者就是说的太深太复杂了,看也看不懂,而且大多数都是用MFC来做,几乎没有讲解原理的,或者说凤毛麟角。
    或者是这样,会的人呢是很少分享这种很酷炫的技术的,不会的人分享也不全面不深入或者说的不明不白的。技术高手都去干嘛去了呢?忙着挣钱还是学习更高级的东西呢?
    像控件自绘这些技术,属于高级技术了。在普通的培训中,是不可能讲这么多这么深入的。而自学又难的让人恐惧,MSDN难啃,有没有很好很系统的文章。我还是继续做好这样的技术分析分享吧,希望让更多人轻松全面的掌握技术。

    先来看看我画的一张对比分析图:

4种控件自绘技术全面对比分析图

【4种控件自绘技术全面对比分析图】
    从图中我们可以看到4种自会技术的对比,一目了然。四种自绘技术分别是:修改控件颜色、用户自绘、拥有者自绘和子类化

1.修改控件颜色

    如果你只是想简单修改控件的颜色,而不需要处理控件的其他UI元素,如文字、交互效果和交互逻辑,那么此技术就很好。因为适用的场景比较简单,因此效果也比较受限制。修改颜色并不能达到想修改哪就修改哪的效果。不过这个技术对于显示文本的静态控件、编辑框等就挺好的。
    修改控件支持的是WM_CTLCOLORXXX系列的消息,下面是这类消息的列表:
WM_CTLCOLORMSGBOX  消息框控件
WM_CTLCOLOREDIT    编辑框控件
WM_CTLCOLORLISTBOX 列表框控件
WM_CTLCOLORBTN     按钮控件
WM_CTLCOLORDLG     对话框
WM_CTLCOLORSCROLLBAR 滚动条控件
WM_CTLCOLORSTATIC   静态控件
    从列表中可以看到,修改控件颜色支持七个类型,其中包括了消息框和对话框,其他的都是标准控件。需要知道的是,按钮的颜色修改没有什么用,请阅读《WM_CTLCOLORBTN消息就是一个摆设》。看了这个文章,你就知道为什么了。还有很多控件是不支持修改颜色的哦。此消息并不是所有控件通用的,只有几个标准的控件,再外加两个。颜色修改技术分析的原理流程详细分析,请阅读《 静态控件颜色修改WM_CTLCOLORSTATIC消息原理分析图解》,控件颜色修改代码使用,请阅读《win32的Static控件颜色文字颜色文字背景颜色的设置》。

2.用户自绘CustomDraw技术

    用户自绘也就是系统提供的一个介于拥有者自绘和修改颜色之间的一种折衷方案。简单的理解就是,控件在需要绘制所有部分时,都会在绘制前后发送消息。根据控件的组成部分,分成多个绘制阶段,每一个阶段的绘制都会产生消息,你可以处理WM_CUSTOMDRAW消息,根据参数来判定不同的阶段,可以选择性绘制。如果你不绘制,就可以让系统完成绘制。你可以只修改你需要修改的UI部分。此类技术一般应用于非标准的控件,这类控件通常比较复杂,由多个部分组成,如列表框、树控件等。下面是支持用户自绘CUSTOMDRAW技术的控件列表:
List view 列表视图(列表控件)
ToolTip   工具栏提示控件
Tree view 树视图(控件)
Toolbar   工具条
其他       所有支持用户自绘的控件
    从列表中可以看到有四个常见的控件,同时,只要你使用的控件支持用户自绘,都可以使用此技术。列表视图通常与列表控件使用差不多。视图可以嵌入在多文档窗口中。此技术还没有写相关原理分析和代码使用文章,将在后续发布,请关注C++技术网上的动态。

3.拥有者自绘OwnerDraw技术

    拥有者自绘控件技术,是建立在完全控制控件绘制的场景。程序员需要负责所有的绘制工作,系统不会代为完成默认绘制工作。因为处理绘制的工作的主体是控件的拥有者,所以叫做拥有者自绘。拥有者自绘处理的消息是WM_DRAWITEM。拥有者自绘技术原理流程分析,请阅读《控件自绘的原理流程图解深入浅出分析》。拥有者自绘技术的代码使用,请阅读《win32按钮自绘实现单击按钮变色文字变色》。很多人很多时候都将拥有者自绘理解为控件自绘。实际上,“拥有者自绘”这个叫法更为准确。控件自绘是一个技术统称,本文谈到的4种方法,全部都属于自绘技术。
    支持拥有者自绘技术的控件列表:
ODT_BUTTON 下压按钮
ODT_COMBOBOX 组合框
ODT_LISTBOX 列表框
ODT_LISTVIEW 列表视图
ODT_MENU 菜单
ODT_STATIC 静态控件
ODT_TAB Tab控件
    从这个列表中也可以看到,并不是所有的控件都支持拥有者自绘的哦。。在这里你可以看到静态控件和按钮控件也在这里,这两个控件不仅支持修改颜色,还支持拥有者自绘。而按钮的颜色修改就是一个摆设,所以按钮的自绘,一般就是用拥有者自绘技术来完成。

4.窗口(控件)子类化技术

    这种自绘技术可以说是终极大招了。因为这个技术已经深入到窗口的本质了,也就是直接处理窗口的消息!子类化技术的原理和用户自绘有点像。在用户自绘里,我们可以处理我们想处理的消息,从而实现修改我们想修改的UI元素。子类化后,控件的消息先流入我们给定的窗口过程,然后我们可以处理感兴趣的消息,然后其他的消息都交给控件默认的窗口过程处理即可。这样我们就达到了只处理我们想处理的消息,还不会影响默认的处理。
    子类化技术可以控制控件的行为,如鼠标移动到控件上之后的响应,一旦鼠标进入控件区域,控件表面就变了颜色或者更换了图像,这是基于行为产生的UI交互,甚至可以产生功能行为,不限于UI处理。因为是直接处理窗口消息的,所以你也可以很好理解处理行为这个逻辑。基于WM_PAINT消息的处理,就是处理UI消息了。子类化原理详细分析,请阅读《窗口(控件)子类化技术原理分析图解》,而子类化技术的代码使用,请阅读《win32实现鼠标经过控件时的实时提示功能》和《窗口子类化如何实现切换多个子窗口控件的焦点》。
    子类化技术支持所有的控件窗口,通吃!只要是窗口就可以子类化。