zoukankan      html  css  js  c++  java
  • 4种控件自绘技术类型分析

    或者是这样,会的人呢是很少分享这种很酷炫的技术的,不会的人分享也不全面不深入或者说的不明不白的。技术高手都去干嘛去了呢?忙着挣钱还是学习更高级的东西呢?

    像控件自绘这些技术,属于高级技术了。在普通的培训中,是不可能讲这么多这么深入的。而自学又难的让人恐惧,MSDN难啃,有没有很好很系统的文章。我还是继续做好这样的技术分析分享吧,希望让更多人轻松全面的掌握技术。

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


    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   工具条

          其他       所有支持用户自绘的控件

    从列表中可以看到有四个常见的控件,同时,只要你使用的控件支持用户自绘,都可以使用此技术。列表视图通常与列表控件使用差不多。视图可以嵌入在多文档窗口中。


    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实现鼠标经过控件时的实时提示功能》和《窗口子类化如何实现切换多个子窗口控件的焦点》。

    子类化技术支持所有的控件窗口,通吃!只要是窗口就可以子类化


    From:http://cjjjs.baijia.baidu.com/article/353236

  • 相关阅读:
    c++ stack 适配器
    错误记录
    css3动画,制作跑步运动,画笔画圆,之类的连贯性动作的方法
    关于$.cookie
    JavaScript中常见易犯的小错误
    关于内存泄漏
    Javascript的异步编程方法
    JavaScript中this关键词的四种指向
    javascript之回调函数小知识
    移动端的兼容性
  • 原文地址:https://www.cnblogs.com/jinxiang1224/p/8468350.html
Copyright © 2011-2022 走看看