当前位置:C++技术网 > 精选软件 > 控件自绘的原理流程图解深入浅出分析

控件自绘的原理流程图解深入浅出分析

更新时间:2016-02-16 12:58:33浏览次数:1+次

    控件自绘是Windows给开发人员提供完全控制控件绘制的一种方式。要实现漂亮的控件UI,对于控件的自绘的深入理解,是非常有必要的。

    为了更好的理解,我绘制了一个控件自绘的原理流程图,如下所以:

控件自绘的原理流程图

【控件自绘的原理流程图】
    在图中,我标注了五个带圈的数字,表示控件自绘的五个步骤。控件的自绘是从控件的窗口过程开始的。因为控件接收到绘制的消息了。所以控件开始做准备,将绘制需要的参数都准备好,这些参数存储在DRAWITEMSTRUCT结构体变量中,然后在LPARAM参数中将参数传递给父窗口,供父窗口绘制控件时使用。这些参数大致包括控件的类型、控件的ID、控件的状态、设备上下文DC的句柄、绘制的矩形大小等等。还有其他参数,可以参考MSDN。
    在WPARAM参数中,也包含了控件的ID,与DRAWITEMSTRUCT结构体中的控件ID是一样的。控件的ID放在WPARAM参数中,应该是方便需要快速使用控件ID的场景。
    有了DC句柄,父窗口就可以在控件上绘制的上下文环境了。在结构体中,提供了绘制的矩形大小,就可以确定绘制的范围了。通过控件的状态可以区分控件是单击时的自绘还是有焦点时的自绘还是怎么的。控件的类型给我们提供了区别对待不同控件的机会。
    所以,我们就利用这些信息绘制控件,绘制成哪样,控件就是哪样。这里我就不写模拟代码了,可以参照《静态控件颜色修改WM_CTLCOLORSTATIC消息原理分析图解》文章的模拟代码,流程差不多,只是消息不一样,参数不一样罢了。
    消息发送到父窗口,父窗口接收到控件自绘消息,然后获取必要的绘制参数,然后开始天马行空的绘制。这些绘制代码,都是由程序员自己写的。最后绘制完成后,返回值使用TRUE。返回TRUE是告诉控件,父窗口已经处理了自绘。当然这只是一个建议,实际测试中我们返回什么都没有太大的差别。不过既然随便返回什么都可以,那么按照建议返回吧。万一什么时候哪个系统的控件版本比较严格,或者在返回FALSE时自动重绘了,那我们的绘制不会被覆盖了。
    控件自绘的消息是WM_DRAWITEM。当控件绘制完毕之后,代码执行就回到了控件窗口过程中。如果控件不再管,就直接结束执行自绘消息处理。如果要严格点,就会检查父窗口处理WM_DRAWITEM消息后的返回值,以确定父窗口是否真正自绘了。如果没有自绘,控件可以在此使用默认的控件自绘处理。
    那么以上就是整个控件自绘的原理流程。用图解和文字详细分析,是不是可以分分钟理解这么晦涩难懂的控件自绘了呢!不过,我知道,虽然理解了原理,但是具体写代码,还是有点心虚,对吧。不用担心,我马上就会结合实际的代码,来给按钮控件进行自绘,让你一睹按钮自绘(控件自绘)代码的风采。关注C++技术网的文章更新就可以了。