GDI+的Brush类本身是一个抽象类,所以不能直接实例化它,但GDI+ API提供了下述5个类扩展了brush类:SolidBrush、TextureBrush、LinearGradientBrush、PathGradiantBrush、HatchBrush。
SolidBrush
SolidBrush b = new SolidBrush(Color.pink);
g.FillRectangle(b,20,20,40,40);
b.Dispose();
TextureBrush类
TextureBrush对象用基于光栅的图像来填充图形,他使用一个来自图像文件如bmp、jpg、png的图像,使用bitmap类可以从文件中获得图像。
Graphics g = e.Graphics;
Bitmap bmp = new Bitmap("a.gif");
TextureBrush tb = new TextureBrush(bmp);
g.FillRectangle(tb,20,20,200,70);
bmp.dispose();
tb.dispose();
在本例绘制的矩形中,左上角的像素是(20,20)。在矩形的左上角只有图像的一部分,因为TextureBrush对象在填充矩形时,把图像用作一个平铺图像,在绘图表面上对图像的拷贝进行排列,他需要有平铺图片的起始点,除非我们明确指出,否则他就会从像素(0,0)开始平铺图片,图片平铺好后,矩形的左上角正好位于一个平铺图片的中间,所以我们在该角上只能看到一部分平铺图片。
这个纹理笔刷还允许使用相同的笔刷绘制许多图形,如果这些绘图操作时重叠的,组成绘图操作的位图就会对齐。如:
g.FillRectangle(tb,20,20,200,70);
g.FillRectangle(tb,45,45,70,150);
重载TextureBrush构造函数可以选择图像的一部分作为其填充图形时的平铺图片,TextureBrush tb = new TextureBrush(bmp,new Rectangle(0,0,25,25));只使用图片左上角提取出来的25像素方块,来平铺矩形。
不同的平铺效果
使用TextureBrush对象的WrapMode属性可以改变使用平铺图片的方式,WrapMode枚举包括:Tile、Clamp、TileFlipX、TileFlipY和TileFlipXY。
Graphics g = e.Graphics;
Bitmap bmp = new Bitmap("a.gif");
TextureBrush tb = new TextureBrush(bmp);
tb.WrapMode = WrapMode.Tile;
g.FillRectangle(tb,this.ClientRectangle);
bmp.dispose();
tb.dispose();
如果把WrapMode属性设置为WrapMode.Clamp,纹理笔刷不会平铺图形,而是把位图放在绘图表面的原点。如果笔刷用于填充一个大于笔刷的矩形,则矩形位于图像外的任何部分都不会绘制出来。
如果把WrapMode属性设置为WrapMode.TileFlipX,纹理笔刷就会在绘图表面上平铺位图,且水平相邻的两个位图会水平翻转。
把WrapMode属性设置为WrapMode.TileFlipY,会得到类似的结果,但这次纹理笔刷会对垂直相邻的两个位图进行垂直翻转。
把WrapMode属性设置为WrapMode.TileFlipXY的效果是上面两个效果的综合。
改变图像的属性
GDI+允许在创建TextureBrush对象时,把ImageAttributes对象传送给TextureBrush构造函数,ImageAttributes对象可以包含影响笔刷绘制图像方式的属性值。如下代码设置背景色是蓝色: Graphics g = e.Graphics; Bitmap bmp = new Bitmap("a.jpg"); float[][] matrixItems = { new float[]{0.2f,0,0,0,0}, new float[]{0,0.8f,0,0,0}, new float[]{0,0,1,0,0}, new float[]{0,0,0,1,0}, new float[]{0,0,0,0,1}}; ColorMatrix colorMatrix = new ColorMatrix(matrixItems); ImageAttributes imageAtt = new ImageAttributes(); imageAtt.SetColorMatrix(colorMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap); TextureBrush tb = new TextureBrush(bmp,new Rectangle(0,0,bmp.Width,bmp.Height),imageAtt); tb.WrapMode = WrapMode.Tile; g.FillRectangle(tb, this.ClientRectangle); bmp.Dispose(); tb.Dispose(); LinearGradientBrush类
LinearGradientBrush对象用颜色线性渐变填充图形,LinearGradientBrush类封装了双色渐变和多色渐变。
使用两个点描述渐变:
提供两个点和两种颜色实例化lineargradientBrush对象
Graphics g = e.Graphics; LinearGradientBrush lgb = new LinearGradientBrush( new Point(0, 0), new Point(50, 10), Color.White, Color.Black); g.FillRectangle(lgb, this.ClientRectangle); lgb.Dispose();
使用矩形描述渐变:
定义渐变的另一个方式是指定一个矩形和一个角度
LinearGradientBrush lgb = new LinearGradientBrush(new Rectangle(0, 0, 50, 50), Color.White, Color.Black, 75f);
75f表示渐变线和水平线之间的角度。
多色渐变可以使用LinearGradientBrush类的SetInterpolationColors方法,它需要一个渐变颜色的数组、一个表示位置的数字数组和一个整数,表示在该序列中设置的颜色总数。
PathGradientBrush类
PathGradientBrush对象也提供了一个用颜色渐变填充图形的笔刷,对于这个类,需要指定一个路径和两种颜色,得到的颜色渐变从制定的路径开始,指向图形的中心点。
Graphics g = e.Graphics; GraphicsPath gp = new GraphicsPath(); gp.AddLine(10, 10, 110, 15); gp.AddLine(110, 15, 100, 96); gp.AddLine(100, 96, 15, 110); gp.CloseFigure(); g.FillRectangle(Brushes.White, this.ClientRectangle); g.SmoothingMode = SmoothingMode.AntiAlias; PathGradientBrush pgb = new PathGradientBrush(gp); pgb.CenterColor = Color.White; pgb.SurroundColors = new Color[] { Color.Blue }; g.FillPath(pgb, gp); g.DrawPath(Pens.Black, gp); pgb.Dispose(); gp.Dispose();
注:不能把SurroundColors属性设置为包含的颜色多于GraphicsPath对象中的线段数,否则会得到异常。
HatchBrush类
该类提供的笔刷可以用各种图案填充图形,影线笔刷的填充图案总是16像素*16像素的双色图案。通过HatchStyle枚举可以设置影线样式。在创建影线笔刷时,只能设置3个选项:前景色、背景色和影线样式,有56中不同的影线样式。
Brushes
GDI+提供了Brushes类,共有141个SolidBrush对象,每一个对象对应于一种预定义的颜色。每次请求Brushes类中的一个笔刷时,都没有显示创建该笔刷,所以不必对它调用dispose方法。Framework设计人员的意图是在应用程序终止前,架构不删除从Brushes类中获得的纯色笔刷。 下面的例子创建一个影线笔刷,然后从该笔刷中创建一个钢笔,用该钢笔绘制一个矩形
HatchBrush hb = new HatchBrush(HatchStyle.WideUpwardDiagonal,Color.White,Color.Black);
Pen hp = new Pen(hb,8);