zoukankan      html  css  js  c++  java
  • Brush画刷

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

  • 相关阅读:
    《构建之法》第四章 第十七章阅读笔记
    2016012037+小学四则运算练习软件项目报告
    阅读《构建之法》所得与初步思考
    随机产生300个四则运算题
    我与软件工程的相识,相知
    转 如何快速看懂一个大型程序 http://blog.csdn.net/jysg9/article/details/24193181
    SQL Server 存储过程(转)
    sql 视图的作用(转http://www.cup.edu.cn/nic/Programing/database/34943.htm)
    linux性能问题(CPU,内存,磁盘I/O,网络)( 转载)
    qtp测试计划
  • 原文地址:https://www.cnblogs.com/ttssrs/p/2396497.html
Copyright © 2011-2022 走看看