5.4.2 用画刷填充内部

来源:互联网 发布:炉石传说diy软件 编辑:程序博客网 时间:2024/05/22 17:16

摘录于《Windows程序(第5版,珍藏版).CHarles.Petzold 著》P142

        Rectangle、RoundRect、Ellipse、Chord、Pie、Polygon 和 PolyPolygon 函数绘制的图形内部会使用设备环境的当前画刷(有时也称为图案(pattern))来填充。画刷是一个 8 * 8 像素的很小的位图,Windows 在水平方向上和垂直方向上重复地使用它来填充一个区域。

        当 Windows 使用抖动显示技术来显示比通常显示器可用颜色更多的色彩时,它实际上是使用画刷来显示颜色的。在单色系统中,Windows 通过混合黑色和白色像素来建立 64 种不同的灰色色调。更确切地说,Windows 可以建立 64 个不同的画刷。对纯黑色,8 * 8 像素的位图的每一个像素的值都是 0。如果 64 位中只有一位是1(1代表白色)就对应第一个灰色色调。如果 2 位是白色对应第二个灰色色调,如此类推,直到所有的8 * 8 的位图都是 1,对应纯白色。对 16 色 或者 256 色的视频系统,画刷也是由抖动实现的,这样 Windows 可以显示的颜色比通常可用颜色更多

        Windows 允许使用 5 种函数来建立逻辑画刷。调用 SelectObject 函数将画刷选入设备环境。逻辑画刷也是 GDI 对象,这和逻辑画笔一样。所以所有你建立的画刷都必须最终被删除,但是如果它当前被选入了设备环境中,则不要删除它。

        下面是用来建立逻辑画刷的第一个函数:

[cpp] view plain copy
  1. hBrush = CreateSolidBrush(crColor);  
这个函数中的 Solid(中文含义为实心)并不意味着画刷为纯色。将该画刷选入设备环境后,Windows 可能会建立一个抖动位图,并且使用它作为画刷。

        可以使用由水平、垂直或者对角线组成的“阴影线标记”(hatch mark)来建立一个画刷。这种样式的画刷对着色条形图的内部和在绘图机上绘图最常用。建立阴影线画刷的函数如下:

[cpp] view plain copy
  1. hBrush = CreateHatchBrush(iHatchStyle, crColor);  

参数 iHatchStyle 表示阴影线标记的外观。图 5-23 显示了 6 种可用的阴影线样式及其外观。

        CreateHatchBrush 函数中的参数 crColor 表示阴影线的颜色。把画刷选入设备环境后,Windows 把这种颜色转换为显示器上可用的最近的纯色。阴影线之间的区域会使用设备环境中定义的背景模式和背景颜色来着色。如果背景模式是 OPAQUE,则背景颜色(也被转换为纯色)用来填充线与线之间的空隙。如果背景的模式是 TRANSPARENT,则 Windows 值画出阴影线,不填充它们之间的空隙。

        也可以通过函数 CreatePatternBrush 和 CreateDIBPatternBrushPt 来建立自己的位图画刷。

        建立逻辑画刷的第 5 个函数包含其他 4 个函数的所有功能:

[cpp] view plain copy
  1. hBrush = CreateBrushIndirect (&logbrush);  
变量 logbrush 是一个类型为 LOGBRUSH(“逻辑画刷”)的结构。这个结构有三个字段,lbStyle 字段的值决定着 Windows 如何解释其他的两个字段。

lbStyle (UINT)lbColor(COLORREF)lbHatch(LONG) BS_SOLID 画刷的颜色 被忽略 BS_HOLLOW 被忽略 被忽略 BS_HATCHED 阴影线的颜色 阴影线画刷样式 BS_PATTERN 被忽略 位图的句柄 BS_DIBPATTERNPT 被忽略 指向 DIB 的指针        在前面我们调用 SelectObject 函数将逻辑画笔选入设备环境,调用 DeleteObject 函数来删除这个逻辑画笔,调用 GetObject 函数来获取逻辑画笔的信息。对于画刷,同样可以使用这三个函数。一旦拥有一个画刷句柄,就可以调用 SelectObject 函数将其选入设备环境:

[cpp] view plain copy
  1. SelectObject (hdc, hBrush);  
然后,调用 DeleteObject 函数删除已建立的画刷:

[cpp] view plain copy
  1. DeleteObject (hBrush);  
但是不要删除当前被选入设备环境的画刷。

        如果需要获取画刷的信息,可以调用 GetObject 函数:

[cpp] view plain copy
  1. GetObject (hBrush, sizeof (LOGBRUSH), (LPVOID) &logbrush);  
其中,logbrush 是一个类型为 LOGBRUSH 的结构。
0 0