当前位置:C++技术网 > 精选软件 > Windows零基础入门:3.6 Win32窗口背景颜色设置说明

Windows零基础入门:3.6 Win32窗口背景颜色设置说明

更新时间:2015-10-02 11:40:36浏览次数:1+次

    窗口类结构体中,还有一个就是窗口的背景。通常见到的有背景颜色、背景图片之类的漂亮的窗口,都与这个窗口背景成员有关。我们今天来了解一下。不过,这里涉及到画图的知识,我们也只做简单的了解,在画图章节里,会详细介绍。
    这个窗口背景成员就是hbrBackground。它是一个画刷句柄类型。在Windows中有各种各样的句柄,比如窗口句柄、实例句柄,有画刷局部,有文件句柄等等,而他们根本上都是一个基本的句柄类型,只是每一种句柄都和特定的资源关联罢了。在系统内容,所有的句柄都是资源的一个唯一引用标志。所以,看到这么多的句柄类型,不要太惊讶和害怕。
    窗口背景涉及到画图,所以这里简单介绍一下画图的知识。在应用程序图标、窗口光标两个成员介绍里,提到了图标句柄和光标句柄,不过我们都是通过函数直接加载得到,所以,对于画图没有直接的感觉。而窗口背景则不太一样,需要我们了解稍微深一些。所以先来介绍几个基本的画图的方面的概念。
    我们得到窗口背景的句柄,使用到了GetStockObject函数。对于函数不了解,第一反应,应该是查MSDN,第二选择才是搜索引擎,最后是问人。这是自主学习对于解决函数不会用的情况应该采取的方法。
    GetStockObject函数的声明如下:

HGDIOBJ GetStockObject(int fnObject);
     此函数只接受一个整型参数,返回一个句柄。stock有存储备用的意思,在这里表示的就是预定义的意思。object是对象、东西的意思,那么这个函数就是获取预定义的对象的函数。可想而知,既然是预定义的一系列对象,而又只有一个参数,你应该可以猜到我们肯定是通过这个参数指定要得到预定义的对象。
    那么这些对象是些什么呢?这些对象就是指的预定义的画笔、画刷和字体。这些对象都是用来作画的。在Windows中,给我们提供了一个作画的功能调用函数组,这一组函数都与画图有关,所以就分成了GDI一类。GDI,全名graphics device interface 图形设备接口,这个就是我们在Windows中作画的工具了。画笔、画刷和字体等,都是用这个工具画出来的。这是图形部分的内容,不在此详细讲述。
    这些预定义的对象,是系统为我们准备好的,数量有限,效果有限。如果你不满足,就可以自己去创造。这些预定以的对象,有7个画刷、3个画笔、1个系统字体和1个调色板。


BLACK_BRUSH 黑色画刷
DKGRAY_BRUSH 深灰色画刷
GRAY_BRUSH 灰色画刷
HOLLOW_BRUSH 空画刷,相当于NULL_BRUSH
LTGRAY_BRUSH 浅灰色画刷
NULL_BRUSH 空画刷
WHITE_BRUSH 白色画刷 

BLACK_PEN 黑色画笔
WHITE_PEN 白色画笔
NULL_PEN 空画笔

SYSTEM_FONT 系统字体,默认用系统字体画菜单、对话框控件和文字。

DEFAULT_PALETTE 调色板,由系统的静态颜色组成。


    在此,我不多解释这些画刷、画笔等。你可以在GetStockObject中传入这些参数,最后就可以得到相应的句柄返回。不过因为这个函数输入的参数有好几种,返回的只有一种,不过他们的类型的本质都是一样的,所以,返回的值就是一个通用的类型HGDIOBJ,如果再赋值给一种类型变量,就一定要做类型转换。所以,我们看到代码中是这样的:

WNDCLASS wndclass;
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
...

     这里传入了一个画刷局部。brush这个就是刷子的意思。英语单词不知道,自己查一下词典吧,我不多解释了。
    那么窗口背景应该传入哪一种类型的呢?笔是用来写字的,刷子是用来刷一个面的,字体也是用来设置文字的样子的,调色板用来设置输出的颜色的。窗口背景指的是窗口中最底一层的一个平面,可以说,窗口背景,就是在窗口上第一次被画上去的那一层。你可以想象,在一面墙中,要搞个背景,你肯定不是用笔去画满所有的位置,那还不累死。同样,windows中也是这样的。只使用画刷来刷,这样才是画刷的名称的意义。
    所以,我们要传入画刷相关的参数,然后类型转换成画刷的类型即HBRUSH,这样就完成了。
    如果获取成功,就返回了句柄。如果失败,则返回的是NULL。所以,如果为了软件稳定健壮,这个可以做一个检测,如果返回是NULL,则不要继续作画,不然也是白搭。你可以在这个情况下,提示一下这个情况,不要让用户以为这个软件没用,同时可以给出解决办法。
    因为这些画图对象,都是系统预定义的,也是系统创建的,所以,用完之后不需要删除。当然,如果你手一滑,调用DeleteObject函数删掉了返回的对象,也没用关系。系统会自动判断对象的类型,系统的你删除也只是走个流程而已,并不会真正的删除的。
    我之前做的一个小软件,设置了自己定义的窗口颜色,效果图如下:

    Win32窗口背景颜色设置说明,小熊定时器