Windows 中7个用来画带边缘的填充图形的函数如下表所示:
函数 |
图形 |
Rectangle |
直角矩形 |
Ellipse |
椭圆 |
RoundRect |
圆角矩形 |
Chord |
椭圆周上的弧,两端以弦连接 |
Pie |
椭圆上的饼图 |
Polygon |
多边形 |
PolyPolygon |
多个多边形 |
Windows 用设备描述表中选择的当前画笔来画图形的边界框,边界框还使用当前背景方式、背景色彩和绘图方式,这跟 Windows 画线时一样。
图形以当前设备描述表中选择的刷子来填充。默认情况下,使用现有对象,这意味着图形内部将画为白色。
Windows 定义了6种现有刷子:
WHITE_BRUSH,LTGRAY_BRUSH,GRAY_BRUSH,DKGRAY_BRUSH,BLACK_BRUSH 和 NULL_BRUSH(也叫 HELLOW_BRUSH).
可以将任何一种现有画刷选入设备描述表中,就和选择画笔一样。
Windows 将 HBRUSH 定义为刷子的句柄。
刷子的获取和选入:
// 定义一个刷子句柄变量
HBRUSH hBrush;
// 获取 GRAY_BRUSH 的句柄
hBrush = GetStockObject(GRAY_BRUSH);
// 选进设备描述表
SelectObject(hdc,hBrush);
// 现在如果要画上表中的任一个图形,则其内部为灰色。
/* ------------------------------------------*/
// 如果想画一个没有边界框的图形,可以将 NULL_PEN 选进设备描述表:
SelectObject(hdc,GetStockObject(NULL_PEN));
// 如果想画出图形的边界框,但不填充内部,则将 NULL_BRUSH 选进设备描述表:
SelectObject(hdc,GetStockObject(NULL_BRUSH));
对于 Polygon 和 PolyPolygon 函数,Windows 使用定义在设备描述表中的当前画刷来填充这个带边界的区域。至于填充内部的方式,则取决于多边形填充方式,可以用SetPolyFillMode 函数来设置:
SetPolyFillMode(hdc,iMode);
默认情况下,多边形填充方式是 ALTERNATE,但是可以将它设置为 WINDING。
用画刷填充内部:
Rectangle,RoundRect,Ellipse,Chord,Pie,Polygon 和 PolyPolygon 图形的内部是用选进设备描述表的当前画刷(也成为“模式”)来填充的。
画刷是一个 8 * 8 的位图,它水平和垂直地重复使用来填充内部区域。
逻辑画刷:
与逻辑画笔一样,逻辑画刷也是 GDI 对象。创建的所有画刷都必须被删除,但是当它还在设备描述表中时不能将其删除。
Windows 有5个函数可以用来创建逻辑画刷,然后就可使用 SelectObject 将画刷选进设备描述表。
创建逻辑画刷的
第一个函数:
hBrush = CreateSolidBrush(crColor);
函数中的 Solid 并不是指画刷为纯色。在将画刷选入设备描述表中时,Windows 创建一个抖动色的位图,并为画刷使用该位图。
可以使用由水平、垂直或者倾斜的线组成的“影线标记(hatch marks)”来创建画刷,
第二个函数为创建影线画刷的函数:
hBrush = CreateHatchBrush(iHatchStyle,crColor);
iHatchStyle 参数描述影线标记的外观,有6种可用的影线标记风格:HS_HORIZONTAL,HS_BDIAGONAL,HS_VERTICAL,HS_CROSS,HS_FDIAGONAL,HS_DIAGCROSS;
crColor 参数是影线的色彩,在将画刷选进设备描述表时,Windows 将这种色彩转换为与之最相近的纯色。影线之间的区域根据设备描述表中定义的背景方式和背景色来着色。如果背景方式为 OPAQUE,则用背景色(它也被转换为纯色)来填充线之间的空间。在这种情况下,影线和填充线都不能是抖动色。如果背景方式为 TRANSPARENT,则 Windows 只画出影线,不填充它们之间的区域。
第三、第四个函数:
CreatePatternBrush 和 CreateDIBPatternBrushPt
创建基于位图的画刷。
第5个函数:
hBrush = CreateBrushIndirect(&logbrush);
变量 logbrush 是一个类型为 LOGBRUSH(“逻辑画刷”)的结构。
和画笔一样,用 SelectObject 将画刷选进设备描述表,用 DeleteObject 删除画刷,用GetObject 来获取逻辑画刷的信息:
// 将画刷选进设备描述表
SelectObject(hdc,hBrush);
// 删除所创建的画刷
DeleteObject(hBrush);
// 获取画刷的信息
GetObject(hBrush,sizeof(LOGBRUSH),(LPVOID)&logbrush);
注意:不要删除当前选进设备描述表的画刷。