在谈到绘制图形时,钢笔和笔刷是最基本的工具。在Graphics类中,大多数函数都需要使用Pen或Brush对象,在GDI+中,Pen类主要用于绘制直线、曲线和图形的边框,而Brush类以各种颜色和图案填充或描绘图形。这两个类在GDI+中使用非常频繁。
首先看Pen类,主要介绍:
不同线宽度的钢笔
绘制实线、点画线和虚线的钢笔,以及如何配置这些样式
绘制带箭头和其他形状的线段的钢笔
连接线段的不同方式
然后是Brush类,主要介绍:
纹理笔刷的行为,以及如何使用它们
如何使用线性渐变笔刷给自定义控件绘制平滑而时尚的外观
如何使用HatchBrush类以指定的图案填充某个区域
最后将描述如何使用笔刷创建钢笔。这个技术允许使用笔刷类型的样式执行钢笔的类型操作,为创建各种类型的效果提供了更大的灵活性。
1.控制钢笔的属性
先创建一个最简单的例子,在vs中新建一个windows窗体应用程序,事件面板中双击进入Paint事件,添加如下代码:
Graphics g = e.Graphics; //创建Graphics对象,为绘图做准备
g.FillRectangle(Brushes.White, this.ClientRectangle);//将客户区域设置为白色
Pen p = new Pen(Color.Black, 5); //设置钢笔颜色为黑色,宽度为5,可以F12看看Pen的构造函数有哪些
g.DrawLine(p, 10, 10, 50, 50); //使用钢笔画一条线段,起点坐标(10,10),终点坐标(50,50)
p.Dispose(); //释放钢笔所用资源
g.Dispose();
效果图:
实际上,Pen类有两个构造函数,各两种方式
第一个构造函数的两种方式:
//Specified color,default width(1px)
Pen p1 = new Pen(myColor);
//Specified color, Specified width(px)
Pen P2 = new Pen(myColor, myWidth);
第二个构造函数的两种方式:(合并使用钢笔和笔刷的功能)
Pen p3 = new Pen(myBrush);
Pen p4 = new Pen(myBrush,myWidth);
2.绘制短划线
//关键部分的代码
Pen p = new Pen(Color.Black, 5);
p.DashStyle = DashStyle.Dash;
g.DrawLine(p, 3, 3, 100, 3);
效果图:
DashStyle枚举由System.Drawing.Drawing2D命名空间提供,它提供了5个预定义的样式:Solid、Dash、DashDot、DashDotDot和Dot。可以自己尝试下。
短划线也可以自己定制,方法是使用一个整数数组,描述短线以及短线之间距离的像素长度,如:
Graphics g = e.Graphics;
g.FillRectangle(Brushes.White, this.ClientRectangle);
Pen p = new Pen(Color.Black, 2);
float[] f = {15, 5, 10, 5};
p.DashPattern = f;
g.DrawRectangle(p, 10, 10, 80,100);
p.Dispose();
g.Dispose();
效果图:
当线宽改成5或更大时会有惊喜,试试!
3.箭头和其他线段端部图形
使用line cap可以指定GDI+如何装饰线段的开始和结尾。事实上这表示把值赋予Pen对象的StartCap和EndCap属性。
Pen p = new Pen(Color.Black, 10);
p.StartCap = LineCap.Round;
p.EndCap = LineCap.ArrowAnchor;
g.DrawLine(p,30,30,80,30);
效果图:
可用线段端部和他们的外观:
4.连接线段
线段之间的连接,主要是设置连接处的样式,System.Drawing.Drawing2D命名空间中LineJoin枚举了四个值:Miter(默认值)、Beveled、MiterClipped和Round。下面将使用Round值绘制一个矩形:
Pen p = new Pen(Color.Black, 10);
p.LineJoin = LineJoin.Round;
e.Graphics.DrawRectangle(p, 20, 20, 60, 60);
p.Dispose();
如图,矩形带有圆角
Pens类
为了方便,GDI+提供了141中预定义的彩色钢笔,对应于Color结构中预定义的141种颜色,使用预定义的钢笔会有一些性能上的优势,由于使用Pens类时没有创建对象,所以不需要释放资源。例如绘制一个。略带桃色的矩形:
Graphics g = e.Graphics;
g.FillRectangle(Brushes.White, this.ClientRectangle);
g.DrawRectangle(Pens.MistyRose, 20, 20, 40, 40);