之前在Graphics类中,简单提到在界面上创建图形,在前面也绘制了一些图形如直线和矩形等。这里就简单实例一遍:
Graphics g = e.Graphics;g.DrawLine(new Pen(Brushes.Black,5), new Point(5, 2), new Point(5, 50)); //直线
g.DrawRectangle(Pens.Black, 20, 2, 80, 60); //矩形
g.DrawEllipse(new Pen(Brushes.Black, 5), new Rectangle(120, 2, 80, 60)); //椭圆
g.DrawBezier(new Pen(Brushes.Black,5),new Point(220, 20),new Point(220,60),new Point(240, 10),new Point(260,80)); //贝塞尔曲线
g.DrawPolygon(new Pen(Brushes.Black,5),new Point[]{new Point(0,100),new Point(200,200),new Point(0,150)}); //多边形
如图:
这都是一些比较规则的,当然DrawPolygon也能画不规则多边形。这里介绍两个类,可以处理不规则的形状,还可以把一组形状组合起来,进来高效处理。这两个类就是GraphicsPath和Region。联合使用这两个类,可以建立更高级的抽象层,创建出更简单、更清晰的代码。
简单的说:GraphicsPath对象是一个由有顺序的一组图形组成的路径,图形可以是线段、曲线段和几何图形组成,因为有顺序,所有必有起点和终点。GraphicsPath对象中的图形可以是不连接的。Region类与GraphicsPath路径相似,但它与区域相关。因此可以用Region对象表示一个形状或一组形状。Region可以包含几何形状或定制的形状,其轮廓是由指定的直线或曲线组成,和GraphicsPath一样,组成Region的形状不必是相连接的。
一旦创建了一个GraphicsPath对象,就可以使用Pen对象在绘图表面绘制路径,在构建了Region对象后,就可以使用Brush对象填充区域了。
GraphicsPath类
GraphicsPath类在System.Drawing.Drawing2D命名空间中,使用时添加该引用。
先给个示例,还是修改Form1_Paint方法中的代码:
Graphics g = e.Graphics;
g.FillRectangle(Brushes.White, this.ClientRectangle);
GraphicsPath gp = new GraphicsPath();
gp.AddLine(10, 10, 10, 50);
gp.AddBezier(10, 50, 10, 55, 25, 70, 30, 70);
gp.AddLine(30, 70, 60, 70);
//闭合图形
gp.CloseFigure();
//再创建一个图形
gp.StartFigure();
gp.AddLine(60, 110, 40, 160);
gp.AddLine(40, 160, 60, 180);
gp.AddLine(60, 180, 140, 150);
gp.AddLine(140, 150, 120, 110);
//GraphicsPath类本身没有提供显示创建路径的功能,所以需要把路径对象传给Graphics类的一个方法来显示
g.DrawPath(Pens.Black, gp);
gp.Dispose();
g.Dispose();
效果图:
给路径填充:
g.FillPath(Brushes.Orange, gp);//给路径填充橘黄色,可以自己试一下效果。
GraphicsPath属性和方法
可以自己F12查看. GraphicsPath类的5个公共属性:
Graphics类的方法有很多,示例中用的比较多的是add开头的为路径添加图形的方法,这里就不列出了。
Region类
从GraphicsPath对象中创建区域,利用上述示例的代码:
Graphics g = e.Graphics;
g.FillRectangle(Brushes.White, this.ClientRectangle);
GraphicsPath gp = new GraphicsPath();
gp.AddLine(10, 10, 10, 50);
gp.AddBezier(10, 50, 10, 55, 25, 70, 30, 70);
gp.AddLine(30, 70, 60, 70);
//闭合图形
gp.CloseFigure();
//再创建一个图形
gp.StartFigure();
gp.AddLine(60, 110, 40, 160);
gp.AddLine(40, 160, 60, 180);
gp.AddLine(60, 180, 140, 150);
gp.AddLine(140, 150, 120, 110);
//g.FillPath(Brushes.Orange, gp);//填充颜色
//GraphicsPath类本身没有提供显示创建路径的功能,所以需要把路径对象传给Graphics类的一个方法来显示
//g.DrawPath(Pens.Black, gp);
Region reg = new Region(gp); //从GraphicsPath对象创建Region对象
//填充区域
g.FillRegion(Brushes.Green, reg);
reg.Dispose();
gp.Dispose();
g.Dispose();
效果图:
可以看到,在处理Region对象时,先要定义包含什么区域,然后再进行区域的操作(与GraphicsPath类似)。
区域的创建都是依靠Region类的重载:
1.从路径中创建:上述示例
2.从各类图形中创建:
Region reg = new Region(new Rectangle(10, 10, 80, 20));
3.从一个区域中创建另一个区域
Region r1 = new Region(new Rectangle(10, 10, 80, 20));
RegionData r1Data = r1.GetRegionData();//区域数据
Region r2 = new Region(r1Data); //构造函数不接受区域对象本身,可以接受区域数据数组。
4.区域的并集和交集
示例:
Graphics g = e.Graphics;
Rectangle rect1 = new Rectangle(50, 10, 50, 130);
Rectangle rect2 = new Rectangle(10, 50, 130, 50);
//设置Region为第一个矩形
Region reg = new Region(rect1);
//用Rect2提取Region中的交集
reg.Intersect(rect2);
g.FillRegion(Brushes.Orange, reg);
g.DrawRectangle(Pens.Black, rect1);
g.DrawRectangle(Pens.Black, rect2);
如图:
区域可以进行代数操作,有如下5个方法:
对应效果:
Region类的方法有很多,点击查看。
GraphicsPath和Region的更多用法后面介绍。