天天看点

WIN32 GDI+ 学习笔记(三):使用画刷(I)

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);

WIN32 GDI+ 学习笔记(三):使用画刷(I)

我们可以通过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);

WIN32 GDI+ 学习笔记(三):使用画刷(I)

另外,如果画刷所填充的形状超出了渐变的分界线,那么就会出现下面的效果:

WIN32 GDI+ 学习笔记(三):使用画刷(I)

2.LinearGradientBrush(Rect& rect, Color& color1, Color& color2, LinearGradientMode mode);

这个方法需要一个矩形,两种颜色,以及一个渐变模式,其中渐变模式LinearGradientMode是一个枚举类型,包括:

LinearGradientModeHorizontal                  = 0

LinearGradientModeVertical             = 1

LinearGradientModeForwardDiagonal    = 2

LinearGradientModeBackwardDiagonal = 3 

效果如下:

WIN32 GDI+ 学习笔记(三):使用画刷(I)

3.LinearGradientBrush(Rect& rect, Color& color1,Color& color2, REAL angle,BOOL isAngleScalable = FALSE);

这个方法需要一个矩形,两种颜色,一个角度和一个标志,如果isAngleScalable为真那么会根据矩形来改变渐变的角度(详细信息请参见MSDN)

效果图:

WIN32 GDI+ 学习笔记(三):使用画刷(I)

渐变画刷也有很多的方法,我在这里介绍几种常用的:

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);

WIN32 GDI+ 学习笔记(三):使用画刷(I)

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);

WIN32 GDI+ 学习笔记(三):使用画刷(I)

3.SetWrapMode(WrapMode wrapMode);

用这个方法可以设置渐变区域平铺的模式,WrapMode为枚举类型,包括:

WrapModeTile           = 0

WrapModeTileFlipX    = 1

WrapModeTileFlipY   = 2

WrapModeTileFlipXY = 3

WrapModeClamp      = 4

效果如图:

WIN32 GDI+ 学习笔记(三):使用画刷(I)

关于画刷就先讲这么多。