gdi+中的brush对象是用来填充一个封闭形状的内部,而且brush对象分为以下几种:
1.实心画刷
2.渐变画刷
3.阴影画刷
4.贴图画刷
5.路径画刷
(本文参考MSDN)
我们先认识一下前两种。
1.实心画刷(SolidBrush)
首先我们需要一个SolidBrush对象,其构造函数为SolideBrush(Color& color),所以我们只需要指定一种颜色就行了
例如:
SolidBrush b(Color(255,0,0));
graphics.FillRectangle(&b,10,10,100,100);
我们可以通过SetColor和GetColor方法来设置和获取画刷的颜色。
2.渐变画刷(LinearGradientBrush)
LinearGradientBrush可以让你用渐变色来填充一个封闭图形。其构造函数有:
LinearGradientBrush(Point& point1,Point& point2,Color& color1,Color& color2);
LinearGradientBrush(PointF& point1,PointF& point2,Color& color1,Color& color2);
LinearGradientBrush(Rect& rect, Color& color1, Color& color2, LinearGradientMode mode);
LinearGradientBrush(RectF& rect, Color& color1, Color& color2, LinearGradientMode mode);
LinearGradientBrush(Rect& rect, Color& color1,Color& color2, REAL angle,BOOL isAngleScalable = FALSE);
LinearGradientBrush(RectF& rect, Color& color1,Color& color2, REAL angle,BOOL isAngleScalable = FALSE);
可能你一下子看到这么多构造函数会有点晕,实际上只有三种不同的方法,现在来分别了解一下
1.LinearGradientBrush(Point& point1,Point& point2,Color& color1,Color& color2);
这个构造方法需要两个点,两种颜色,举个例子:
LinearGradientBrush b(Point(0,0),Point(500,250),Color(255,0,0),Color(0,0,255));
graphics.FillRectangle(&b,0,0,500,250);
另外,如果画刷所填充的形状超出了渐变的分界线,那么就会出现下面的效果:
2.LinearGradientBrush(Rect& rect, Color& color1, Color& color2, LinearGradientMode mode);
这个方法需要一个矩形,两种颜色,以及一个渐变模式,其中渐变模式LinearGradientMode是一个枚举类型,包括:
LinearGradientModeHorizontal = 0
LinearGradientModeVertical = 1
LinearGradientModeForwardDiagonal = 2
LinearGradientModeBackwardDiagonal = 3
效果如下:
3.LinearGradientBrush(Rect& rect, Color& color1,Color& color2, REAL angle,BOOL isAngleScalable = FALSE);
这个方法需要一个矩形,两种颜色,一个角度和一个标志,如果isAngleScalable为真那么会根据矩形来改变渐变的角度(详细信息请参见MSDN)
效果图:
渐变画刷也有很多的方法,我在这里介绍几种常用的:
1.SetBlend(REAL *blendFactors,REAL *blendPositions,INT count);
blendFactors是实数数组,里面的数字的值从0.0到1.0,代表两种颜色的混合程度,0.0表示100%起始色,1.0表示100%终止色,而blendPositions也是实数数组,里面的数字代表blendFactors中对应混合颜色的位置,从0.0到1.0,代表0%到100%。count表示blendFactors和blendPositions中的元素个数。
举个例子:
REAL factors[4] = {0.0f, 0.4f, 0.6f, 1.0f};
REAL positions[4] = {0.0f, 0.2f, 0.8f, 1.0f};
Rect rect(0, 0, 500, 250);
LinearGradientBrush linGrBrush(rect,Color(255, 0, 0), Color(0, 0, 255), LinearGradientModeHorizontal);
linGrBrush.SetBlend(factors, positions, 4);
graphics.FillRectangle(&linGrBrush, rect);
2.SetInterpolationColors(Color *presetColors,REAL *blendPositions,INT count);
如果觉得颜色不够多,那么我们可以用这个方法来添加更多的颜色。presetColors是颜色数组,里面按顺序定义你想要的颜色,blendPositions是实数数组,里面的数字从0.0到1.0说明presetColors中对应颜色的位置,count为元素个数。
举个例子:
Color colors[] = {
Color(255, 0, 0),
Color(0, 0, 255),
Color(0, 255, 0)};
REAL positions[] = {
0.0f,
0.3f,
1.0f};
LinearGradientBrush linGrBrush(
Point(0, 0),
Point(500, 0),
Color(0, 0, 0),
Color(0, 0, 0));
linGrBrush.SetInterpolationColors(colors, positions, 3);
graphics.FillRectangle(&linGrBrush, 0, 0, 500, 300);
3.SetWrapMode(WrapMode wrapMode);
用这个方法可以设置渐变区域平铺的模式,WrapMode为枚举类型,包括:
WrapModeTile = 0
WrapModeTileFlipX = 1
WrapModeTileFlipY = 2
WrapModeTileFlipXY = 3
WrapModeClamp = 4
效果如图:
关于画刷就先讲这么多。