VB.NET绘图8---总结

《VB.NET 绘图基础》吧,因为篇幅实在有点长,计划分成:Graphics章、Pen章、Brush章、Text章。由于涉及到的内容比较多,加之包含比较多的实例代码,所以根据内容的长短把每一章分成若干篇博文发出来。其中:
Graphics章:(计划分成四篇)
一.Graphics类之一:
内容:绘图概述、绘图涉及到的命名空间
二.Graphics类之二:
内容:Graphics类的绘图方法1. DrawArc、2. DrawBezier、3. DrawBeziers、4. DrawClosedCurve、5. DrawCurve、6. DrawEllipse、7. DrawIcon、8. DrawIconUnstrerched。
三.Graphics类之三:
内容:Graphics类的绘图方法9. DrawImage、10. DrawImageUnscaled、11. DrawLine、12. DrawLines、13. DrawPath、14. DrawPie、15. DrawPolygon、16. DrawRectangle、17. DrawRectangles、18. DrawString。
四.Graphics类之四:
内容:Graphics类的填充图形的方法、其他图形属性和方法、抗锯齿、转换基础。
Pen章(计划分成两篇)
五.Pen类之一:
内容:画笔基础
六.Pen类之二:
内容:画笔对齐、CompoundArray属性、自定义线帽和画笔转换。
Brush章(计划分成两篇)
七.Brush之一:
内容:画刷、SolidBrush、TextureBrush、HatchBrush、LinearGradientBrush
八.Brush之二:
内容:PathGradientBrush、GraphicsPath对象
Text章(计划分成两篇)
九.绘制Text之一:
内容:绘制文本、制表位、修剪
十.绘制Text之二:
内容:MeasureString方法、字体度量标准

第一篇:Graphics类之一
Visual Basic .NET为绘图和控制绘图属性提供了类别丰富的对象。Graphics对象提供描绘和填充矩形、椭圆形(圆形)、多边形、曲线、直线和其他形状的方法。Pen和Brush对象分别用来确定线条(实线、虚线、点线)和填充区域(纯色、阴影线、渐变线)的外观。
本文概述绘制图形的基本步骤,以及最基本的、重要的绘图命名空间及其类。详细介绍最重要的Graphics类,并示范如何使用该类。

一.绘图概述
无论什么时候,只要在Visual Basic .NET中绘图,就必须使用Graphics对象。这个对象代表绘图时的平面,对于PictureBox、Form或PrintDocument都是如此。有时候,你必须自己创建一个Graphics对象,而有些时候(比如在Paint事件中),会自动提供一个Graphics对象。
GDI+(Graphics Device Interface+)或.NET版本的绘图程序使用Pen和Brush两个类来确定所绘制图形的外观。
Pen对象确定如何画线。Pen用来设置线条的颜色、宽度、虚线样式、线头样式和其他属性。Pen应用于所有GDI+程序画的线条。例如,DrawPolygon子程序画出一连串线条,而其Pen参数将确定如何画出所有这些线条。
Brush对象确定如何填充这些区域。Brush用来设置填充区域的填充色、阴影图案(线条、点、格子或其他形状的图案)、颜色渐变(从一种颜色变到另一种颜色)和纹理(平铺在填充区域上的图像)。Brush应用于所有填充封闭区域的GDI+程序,例如,FillRectangle、FillEllipse和FillPolygon。
值得一提的是,在Visual Basic .NET中无论是对于PictureBox还是Form,默认的平面直角坐标系统是这样约定的;左上角为原点即坐标为(0,0),且水平向右方向为X轴的正方向,而垂直向下为Y轴的正方向。
绘制简单图形的基本步骤是:
1.获得一个Graphics对象。
2.定义一个Brush对象,用来填充图形(如果你需要填充的话)。
3.定义一个Pen对象,绘制图形的线条(如果你需要绘制线条的话)。
下面通过一个例子,来说明如何具体绘制图形;本程序首先创建一个Graphics类的对象MyGraphics,并实例化为Form的Graphics对象;接下来声明并实例化MyBrush对象为SolidBrush对象,颜色为桔红色,使用Graphics类的FillEllipse方法绘制了一个由MyBrush对象确定颜色的封闭圆(该圆内切与左上角坐标X=20,Y=20,宽度为100,高度为100的正方形区域);最后声明并实例化Pen对象MyPen为兰色,宽度为8,使用Graphics类的DrawEllipse方法绘制了一个由MyPen对象确定颜色和线条宽度的圆(该圆内切与左上角坐标X=20,Y=20,宽度为100,高度为100的正方形区域)。
在窗体上添加一个按钮,完整代码如下:
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles Button1.Click
Dim MyGraphics As Graphics ‘声明一个Graphics类的对象
MyGraphics = Me.CreateGraphics ‘实例化该对象为Form的Graphics对象
‘SolidBrush是Brush的继承类
‘声明并实例化SolidBrush对象为桔红色
Dim MyBrush As New SolidBrush(Color.Orange)
‘在左上角坐标x=20,y=20,宽度为100,高度为100的正方形区域内
‘用MyBrush对象画刷,绘制一个实心圆(有填充的圆)
MyGraphics.FillEllipse(MyBrush, 20, 20, 100, 100)
Dim MyPen As New Pen(Color.Blue, 8) ‘声明并实例化Pen对象为兰色,宽度为8
‘在左上角坐标x=20,y=20,宽度为100,高度为100的正方形区域内
‘用MyPen对象画笔,绘制一个圆
MyGraphics.DrawEllipse(MyPen, 20, 20, 100, 100)
End Sub
End Class
运行程序,单击按钮,显示效果如下图:
[转载]VB.NET 绘图基础01–Graphics类之一
上面这个例子,只是想告诉大家,使用VB.NET绘制图形,离不开Graphics对象,此外如果是绘制图形就必须要Pen对象,如果是填充图形(绘制实心的图形)就必须要有Erush对象。
归纳小结:绘制图形的三步:
1. 创建一个Graphics对象实例。
绘制图形必须创建Graphics对象。如果是在窗体上绘图,要使用下列代码创建Graphics对象;
Dim MyGraphics As Graphics = Me.CreateGraphics
如果是在PictrueBox里绘图,要使用下列代码创建Graphics对象;
Dim MyGraphics As Graphics = PictureBox1.CreateGraphics
2. 定义一个Brush对象,用来填充图形(如果你需要填充的话)。
如果填充封闭曲线或者多边形,必须创建Brush对象(或者Brush类的继承类对象),用来确定填充的颜色。例如下面的代码,创建了一个填充红色的画刷对象。在最后的括号里,用Color结构指定的枚举值,确定画刷的颜色。限于篇幅有关Color结构这里不展开,可能在后续博文里介绍。
Dim RedBrush As New SolidBrush(Color.Red)
3. 定义一个Pen对象,绘制图形的线条(如果你需要绘制线条的话)。
如果想绘制线段,必须创建Pen对象。用来确定线段的颜色。例如下面的代码,创建了黑色的画笔对象。在最后的括号里,运用Brushes类指定的标准颜色,确定画笔的颜色。
Dim BlackPen As New Pen(Brushes.Blue, 5)
下面给出一个例子,窗体上添加一个按钮Button1控件和一个PictureBox1控件,完整的代码:(FillEllipse()、DrawEllipse()、New Rectangle()方法,有待后续内容介绍)
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
PictureBox1.Left = 120
PictureBox1.Top = 0
PictureBox1.Width = 130
PictureBox1.Height = 80
PictureBox1.BackColor = Color.White
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
‘在窗体上绘制
Dim MyFormGraphics As Graphics = Me.CreateGraphics
Dim RedBrush As New SolidBrush(Color.Red)
Dim BluePen As New Pen(Brushes.Blue, 5) ‘画笔宽度为5,默认值为1
‘在窗体上填充一个实心的圆
MyFormGraphics.FillEllipse(RedBrush, New Rectangle(3, 3, 50, 50))
‘在窗体上绘制一个空心圆
MyFormGraphics.DrawEllipse(BluePen, New Rectangle(3, 3, 50, 50))
‘在图片框里绘制
Dim MyPicGraphics As Graphics = PictureBox1.CreateGraphics
Dim PinkBrush As New SolidBrush(Color.Pink)
Dim BlackPen As New Pen(Brushes.Black) ‘采用默认的画笔宽度值为1
‘在窗体上填充一个实心的椭圆
MyPicGraphics.FillEllipse(PinkBrush, New Rectangle(2, 2, 80, 50))
‘在窗体上绘制一个空心的椭圆
MyPicGraphics.DrawEllipse(BlackPen, New Rectangle(2, 2, 80, 50))
End Sub
End Class
显示效果如下图:
[转载]VB.NET 绘图基础01–Graphics类之一

注意:上述按钮的单击事件里的代码,完全可以用下面代码取代,而效果相同。
Dim MyFormGraphics As Graphics = Me.CreateGraphics
MyFormGraphics.FillEllipse(New SolidBrush(Color.Red), New Rectangle(3, 3, 50, 50))
MyFormGraphics.DrawEllipse(New Pen(Brushes.Blue, 5), New Rectangle(3, 3, 50, 50))

    Dim MyPicGraphics As Graphics = PictureBox1.CreateGraphics
    MyPicGraphics.FillEllipse(New SolidBrush(Color.Pink), New Rectangle(2, 2, 80, 50))
    MyPicGraphics.DrawEllipse(New Pen(Brushes.Black), New Rectangle(2, 2, 80, 50))

二.绘图命名空间
在开始学习GDI+绘图之前,有必要花些时间了解有哪些与之相关命名空间,这些命名空间内又包含哪些对象。默认情况下,System.Drawing命名空间会自动导入到新应用程序中,所以不需要通过显式地导入它来使用Graphics、Pen、Brush和其他基本的绘图对象。但是,如果创建自定义虚线(长虚线、点划线)、线性渐变色填充(从一种颜色渐变到另一种颜色,可能还会渐变到其他颜色)或高级图像文件(JPEG、GIF和TIFF等),则必须知道需要将哪些命名空间导入到应用程序中。

二.1 System.Drawing
System.Drawing命名空间包含那些最重要和最基本的GDI+类。这些类包括Graphics、Pen、Brush、Font、FontFamily、Bitmap、Icon和Image。下表介绍System.Drawing中最有用的类。
1. Graphics:毫无疑问,这是创建图形时将会使用的最重要的对象。GraPhies对象代表您要在其上绘制图形的表面,它可能是PictureBox、窗体、内存中的位图或其他什么。Graphics对象提供绘制线条、矩形和椭圆等图形的方法。
2. Pen:该类代表线条的绘制特征,包括线条的颜色、宽度和虚线样式等。
3. Pens:该类提供很多具有不同颜色且宽度为1的预定义画笔。例如,可以使用Pens.Blue作为标准的蓝色画笔。
4. Brush:该类确定如何填充实心区域。它确定是否使用纯色、影线、图案或其他来填充相应区域。
5. Brushes:该类提供很多具有不同颜色的预定义画刷。例如,可以使用Brushes.Gree将相应区域填充为绿色。
6. SolidBrush:该类代表一个实心画刷。当您想用纯色填充对象时,可以使用SolidBrush。对于大多数应用程序,这是目前最为常见的填充类型。
7. Bitmap:该类代表由像素而不是线条定义的位图。
8. Icon:该类代表与位图类似的Windows图标。
9. Metafile:该类代表一个包含图形操作(程序可以对其记录、保存到文件、从文件加载和回放)的图形元文件。
10. Image:这是一个抽象基类,Bitmap、Icon和Metafile都继承自它。某些程序之所以能够处理这些类型的对象,就是因为使用了Image参数(简言之,位图就是典型的图片。图标有透明度,可能还有热点信息,因此它可以充当窗体或应用程序的图标,或者鼠标指针。元文件包含绘图指令,一些应用程序可以使用这些指令平滑地缩放图片)。
11. Font:该类代表特定的字体。它定义了字体的名称、尺寸和样式(例如,斜体或粗体)。
12. FontFamily:该类代表具有相似特征的一组字体。
13. Region:该类用来定义通过矩形和路径创建的形状。可以填充一个区域,使用它执行碰撞测试(hit testing),或将一副图剪切成某一形状。
14. Color:该对象将颜色的红、绿、蓝三种成分定义为介于0一255之间的值,再加上一个代表颜色透明度的阿尔法(alpha)值。阿尔法值为0代表该对象完全透明,值为255代表完全不透明。
15. Point:该对象定义点的X和Y坐标。
16. Size:该对象定义宽度和高度。
17. Rectangle:该对象使用Pnint和Size定义矩形。
GDI+程序在屏幕、打印机或其他用来绘制图形的对象上,使用像素工作,因此Point、Size和Rectangle结构体使用的是整数坐标和尺寸。然而,System.Drawing命名空间也定义了PointF、SizeF和RectangleF类来处理浮点值。
Color类提供大量预定义的颜色值。例如,Color.PaleGreen用来定义浅绿色。可以使用这些预定义颜色,而不必去创建新的颜色对象。

二.2 System.Drawing.Drawing2D
在System.Drawing.Drawing2D命名空间中,包含了大多数用来绘制更先进的二维图形的对象。在这些类当中,一些类精炼了较基本的绘图类,或为这些绘图类定义了值。例如,HatchBrush类代表一个特殊类型的Brush,它使用阴影图案进行填充。
1. HatchBrush:该类定义一个用阴影图案填充区域的Brush。它定义该图案、前景色和背景色。
2. LinearGradientBrush:该类定义一个用线性渐变色填充区域的Brush。默认情况下,颜色会沿着定义的线从一种颜色渐变到另一种颜色,但也有可能是多种颜色渐变。
3. Blend:该类代表LincarGradientBrush或PathGradientBrush的一种混合模式。例如,假定定义了从红色到黄色的渐变。通常情况下,渐变是平滑和线性的,但可以使用Blend改变这种情况。例如,让红色很快地变为黄色,可以设置80%为黄色,剩下20%从红色渐变到黄色(Blend的效果并不明显)。
4. PathGradientBrush:该类与LinerGradientBrush类似,但渐变效果是沿着路径而不是直线。
5. ColorBlend:该类为LinearGradientBrush或PathGradientBrush定义了颜色和位置。这能够让颜色沿着画刷路径在多种颜色间变化。
6. GraphicsPath:该类代表一连串相互连接的直线和曲线。可以绘制、填充或修剪成GraphicsPath。例如,可以将文字添加到GraphicsPath中,然后绘制它的轮廓或修剪使其只显示在文本路径内。
7. Matrix:该类代表一个3×3的转换矩阵。可以使用矩阵转换、缩放和旋转图形。
在System.Drawing.Drawing2D命名空间中,还定义了一些用于更高级绘图的枚举值,下面介绍这些枚举值;
System.Drawing.Drawing2D命名空间中用于绘图的枚举值
DashCap:这些值用来确定如何绘制虚线的末端。DashCap值包括Flat、Round和Triangle。
DashStyle :这些值用来确定如何绘制虚线。DashStyle值包括Dash、DashDot、Dash、DotDot、Dot、Solid和Custom。如果将Pen的DashStyle属性设置为DashStyle.Custom,还应当将它的DashPattern属性设置给一个数字,以告诉Pen需要绘制和跳过多少像素。例如,数组{10,20,5,2}表示绘制10,跳20,绘制5,跳2,然后根据需要再重复这些动作。
LineCap:这些值用来确定如何绘制实线的末端,它的值包括ArrowAnchor、DiamondAnchor、Flat、NoAnchor、Round、RoundAnchor、Square、SquareAnchor、Triangle和Custom。如果LineCap的值是Custom,则当使用CustomLineCap对象定义线头。
LineJoin:这些值用来确定GDI+绘制连接线的方法如何将线连接起来。例如,DrawPolygon和DrawLines方法就使用该属性。它的值包括Bevel、Miter、Round和Miterclipped。根据斜接面长度是否超出一定限度,MiterClipped生成一个斜接角(mitered corner)或斜角(beveled coner)。
HatchStyle:这些值用来定义HatchBrush对象填充区域时所使用的样式。它包括54个值,由于数量过多,我们不再在此一一列举。但是,我们在后续的程序执行的效果图中展示了它们的示例。

二.3 System.Drawing.Imaging
System.Drawing.Imaging命名空间包含处理更高级位图图形的类。其中包含定义图像文件格式(例如,GIF和JPG)的类,管理颜色调色板的类,定义图形元文件的类。
1. ImageFormat:此类用来指定图像的格式,格式可以是bmp、emf、exif、gif、icon、jpeg、底图(memory bitmap)、png、tiff或wmf。
imagesbitmapsandmetafiles/typesofbitmaps.asp。
2. ColorMap:此类定义了从旧颜色值到新颜色值的映射。可以使用ColorMaps,将图像中的某些颜色改为其他颜色。
3. ColorPalette:此类代表一个包含各种颜色值的调色板(调色板是特定图像中颜色值的集合。例如,8位图像只能包含256种不同的颜色,它的调色板中会列出所要使用的颜色,并且使用一个8位的数字标出每个像素颜色在调色板中的索引。最近,更高的颜色校型16位、24位和32位已经变得更为普遍.在这些颜色模型中,直接用二进制位给出每个像素的红、绿和蓝的成分,而不引川调色板,所以不再需要调色板)。
4. Metafile:此类代表一个包含绘图指令的图像元文件。可以创建、保存、重载和回放放元文件的信息。
5. MetafileHeader:该类用来定义Metafile对象(图元文件使程序能够根据直线、曲线和填充区域,而不是使用位图中的像素绘图。这使得程序以后重新绘制该图像的缩放版、旋转版或其他变化的版本,可以非常流畅而不像位图文件一样存在失真情况)的属性。
6. MetaHeader:此类包含有关Windows图元文件(WMF)的信息。
7. WmfPlaceableFileHeader:此类可以定义如何将图元文件映射到输出设备。使用此类,可以确保在将图元文件导入到绘图程序(例如,CorelDRAW)时,合适地设置图元文件的尺寸。

二.4 System.Drawing.Text
System.Drawing.Text命名空间中只包含三个类,这三个类提供了一个有点笨的方法,来了解安装在系统中的字体和为应用程序安装的字体。
1. FontCollection:继承类InstalledFontCollection和PrivateFontCollection的基类。它提供了一个方法,该方法返回一个包含FontFamily对象的数组。
2. InstalledFontCollection:该类继承自FontCollection类。该类的FamilieS方法返回一个包含FontFamily对象(代表系统中安装的字体)的数组。
3. PrivateFontCollection:此类也继承自FontCollection类。
此类的对象代表应用程序从字体文件中安装的字体。程序可以使用此对象只为使用的应用程序安装字体,而不为系统中的其他应用程序安装字体。此类提供了多个安装和列出应用程序字体的方法。
System.Drawing.Text命名空间还定义了TextRenderingHint枚举。抗锯齿(Anti-aliasing)是指使用不同阴影的像素使锯齿状的边缘和曲线显得更平滑。可以通过设置Graphics对象的TextRenderingHint属性,告诉Visual Basic是否应使用抗锯齿平滑字体。
TextRenderingHint枚举值
AntiAlias:以抗锯齿的方式绘制字符,不使用微调(hinting)。
AntiAliasGridFit:使用微调,以抗锯齿的方式绘制字符,优化丁干线(stem)和曲线。
ClearTypeGridFit:使用微调和ClearType字形(glyph)绘制字符,利用了ClcarTyPe字体的优势。在这里,字形是指字符的图像。一些字体绘作字形,另一些字体(例如TrueType)则绘作字体外形(outline)。TrueType字体是由微软和Apple一起开发的。ClearType是微软开发的一种较新的字形字体。
SingleBitPerPixel:不以抗锯齿方式,或不使用微调,绘制字符。这是一种速度最快、质量最差的设置。
SingleBitPerPixelGridFit:不以抗锯齿方式,但使用微调,绘制字符。
SystemDeFault:使用系统默认设置绘制字符。

下面的代码分别显示了程序使用和不使用抗锯齿方式显示文字的效果。首先,它创建了一个很大的字体,然后将Graphics对象的TextRenderingHint属性设置为AntiAliasGridFit绘制几个字符。然后,再将TextRenderingHint属性设置为SingleBitPixel,新绘制这几个字符。
Imports System.Drawing.Text
Public Class Form1
Private Sub Form1_Paint(ByVal sender As Object, ByVal e As _
System.Windows.Forms.PaintEventArgs) Handles Me.Paint
‘设置一个大字体
Dim the_font As New Font(Me.Font.FontFamily, 40, _
FontStyle.Bold, GraphicsUnit.Pixel)
‘应用抗锯齿绘制文本字符
e.Graphics.TextRenderingHint = TextRenderingHint.AntiAliasGridFit
e.Graphics.DrawString(“Alias”, the_font, Brushes.Black, 5, 5)
‘无抗锯齿的绘制文本字符
e.Graphics.TextRenderingHint = TextRenderingHint.SingleBitPerPixel
e.Graphics.DrawString(“Alias”, the_font, Brushes.Black, 5, 50)
End Sub
End Class
下图是显示的效果;
[转载]VB.NET 绘图基础01–Graphics类之一

本例特意把字体设置得很大,以显示两者的不同之处。使用了抗锯齿的字符使用了不同的灰阶将字符变得更加平滑。

二.5 System.Drawing.Printing
System.Drawing.Printing命名空间中包含用于打印的对象和管理打印机特性的对象。
通常情况下,若要生成一个可以打印的文档,需要先创建一个PrintDoucument对象。然后,通过设置该对象的属性来定义打印属性,最后再调用它的Print方法。当打印时,PrintDoucument对象会生成PrintPage事件,该事件能够在打印输出页面上绘图。
本命名空间中的其他类定义了PrintDoucument对象的属性。下面介绍其中最有用的一些属性对象。
1. PageSettings:此类用来为整个PriniDocumnent或某一特定页面定义页面设置。此对象的属性有Margins、PaperSize、PaperSource、PrinterResolution和Printersettings对象。
2. Margins:此类通过它的Top、Bottom、Left和Right属性定义应用到要打印的页面上的边界。
3. PaPerSizc:此类用来定义纸张的尺寸。可以将该对象的Kind属性设置为一个标准值,例如A2、Legal或Letter。此外,也可以明确地设置该对象的Height和Width属性。
4. PaperSource:此类用来定义打印机的纸张来源.可以将该对象Kind属性的值设置为AutomaticFeed、Upper、Middle、Lower、Envelope和ManualFeed。
5. PrinterResolution:此类用来定义打印机的解析度。
6. PrinterSettings:此类用来定义打印机的设置。可以使用此类获取一些设置的值,例如,打印机是否可以打印双面(canDuplex),所安装的打印机的名称(InstalledPrinters)和该打印机支持的解析度(PrinterResolutions)。可以使用其他属性控制打印机。例如,可以设置拷贝数(Copies),可以设置用户在打印机对话框中所能选择的最小和最大页数(MinimumPage和MaximumPage),以及确定打印机是否对输出进行自动分页(Collate)。

说明:
1、以上内容参考书目:《Visual Basic 2005编程参考手册》(美)Rod Stephens 著,徐璐,姜玲玲 译,清华大学出版社2008年5月出版。
2、涉及的例子代码都经过VB2010版测试通过。

猜你喜欢

转载自blog.csdn.net/weixin_43075782/article/details/82117151