1、工程应用培训教材Visual Basic 6.0 程序员培训教程 第八节 绘图应用背景在自动化系统的应用程序中适当加进些图形和动画常常可以增加程序的魅力,能够更加直接反映系 统状态 的变化,使程序多姿多彩。利用 VB 提供的有关图形显示控件和绘图方法可以很容易地完成各种图形编程工作,若将它们灵活地加以应用,就能 够完成我 们的设计任务。例如需要显示氧化铝回转窑壁温度分布的变化趋势,需要以不同的色彩明暗代表温度值,参 见图 7-1 为 回转窑外壁温度分布 趋势 。图 7-1 六台回 转窑外壁温度分布趋势知识要点(1) 绘图板VB 的图画框控件 Picture,还有窗体 Form,都可以作为来绘图
2、板。VB提供了自己的坐标系,左上角 为原点(0, 0),往右 为 X 方向,向下为 Y 方向。我们在窗体上画了一个图画框 Picture1,宽度和高度的值是以系统默认的单位给出的,相应的坐标也是同 样的。在实际中,我 们往往需要确定自己的坐标单位,这就需要坐标转换。Picture 控件提供了 Scalewidth 和 Scaleheight 两个属性帮助我们重建坐标系。例如,需要 图画框 Picture1 的宽度为 20,高度也为 20,怎么办呢?你只要在程序中加入:工程应用培训教材Visual Basic 6.0 程序员培训教程 Picture1. Scalewidth=20Picture1
3、. Scaleheight=20(2) 绘图的颜色底色 BackColor 为大部分控件拥有的属性,利用它可以改变绘图板的底色。前景色 ForeColor 表示在控件上打印( Print 方法)文字、画点( Pset 方法)、画线(Line 方法)、画圆(Circle 方法)等所得到的图形的颜色。填充色FillColor 表示象 圆、方框等封 闭曲线的内部填充颜色。(3)绘图用的笔这是一个无形的笔,它的颜色 为 ForeColor 属性,它 还有画图的风格(DrawStyle 属性)、方式 (DrawMode 属性)和笔尖的粗细(DrawWidth 属性)。DrawStyle 确定 线形为实线
4、、虚 线、点划 线等,DrawMode 确定 为实画、透明等,DrawWidth 确定绘制的曲 线宽度。例如 设置回图笔,如下:Picture1. DrawMode=13Picture1. DrawStyle=0Picture1. DrawWidth=2(4)绘图方法绘图时可以采用不同的方法实现不同的绘图目的,例如画点、线、圆等,分别用 Pset 方法(点)、Line 方法( 线)、 Circle 方法(圆)。画点:Pset Step (x, y), colorx, y 是想查看当前点的水平(x-轴)和垂直(y- 轴)坐标,必须用括号,color 指定 该点的 RGB 颜色,如果它被省略,则使
5、用当前的 ForeColor 属性值,可用 RGB 函数或 QBColor 函数指定颜色。例如: 设置 Picture1 上(10,5)处为红色 :Picture1.Pset (10,5),QBColor(4)画直线: Line Step (x1, y1) Step (x2, y2), color, BF直线的起点坐标为(x1,y1),终点坐标为(x2,y2)。下列 语句演示了这个方法最简单的形式:Picture1.Line (1,5) (5,10)直线的的宽度取决于 DrawWidth 属性,其 样式取决于 DrawStytle 属性,如可以画实线、虚线、点划线等。各个参数的意义如下:Ste
6、p可选的。指定 线的起点坐 标,它相对于由 CurrentX 和 CurrentY 属性提供的当前图形位置。(x1, y1)可选的。直线或矩形的起点坐标,如果省略, 线起始于由 CurrentX 和 CurrentY 指示的位置。Step可选的。指定相 对于线的起点的 终点坐标。 (x2, y2)直线或矩形的终点坐标。color可选的。画线时用的 RGB 颜色,如果它被省略,则使用 ForeColor 属性值。可用 RGB 函数或 QBColor 函数指定颜色。工程应用培训教材Visual Basic 6.0 程序员培训教程 B可选的。如果包括,则利用对角坐标画出矩形。F可选的。如果使用了 B
7、 选项,则 F 选项规定矩形以矩形边框的颜色填充,B 与 F 必须同时使用。画圆:Circle Step(x, y), radius, color(x,y) 参数是 圆 心的坐标,radius 参数是圆的半径,color为画圆的指定色彩。例如,下面语句将画出一个以 (5,5) 为圆心、10 为半径的圆:Picture1. Circle (5,5),10应用举例:例 1:编写程序,在窗体 Form1 的 Picture1 绘图控件上同时绘 制 y=sin(x),y=cos(x)曲线,其中 x 在 0 到 10 弧度范围内。1创建一个标准 exe 的工程 1,在工程的窗体上增加 PictureBo
8、x 控件Picture1,增加模 块 Module1。2在模块 Module1 增加函数 drawcurve(pic As PictureBox),代码如下:Public Sub drawcurve(pic As PictureBox)Dim i As SingleDim s As SingleDim ox, oy As Singlepic.ScaleHeight = 2pic.ScaleWidth = 12ox = 2: oy = 1pic.DrawMode = 13pic.DrawStyle = 0pic.DrawWidth = 1draw axis of x,ypic.Line (0,
9、1)-(12, oy), vbBluepic.Line (ox, 0)-(ox, 2), vbBluedraw sin(x) curvepic.DrawStyle = 1s = 0.02For i = 0 To 10 - s Step spic.Line (i + ox, Sin(i) + oy)-(i + s + ox, Sin(i + s) + oy), vbRedNext i工程应用培训教材Visual Basic 6.0 程序员培训教程 draw cos(x) curvepic.DrawStyle = 2s = 0.02For i = 0 To 10 - s Step spic.Lin
10、e (i + ox, Cos(i) + oy)-(i + s + ox, Cos(i + s) + oy), vbRedNext iEnd Sub上述代码中,首先确定在 picture1 中绘图版的大小,即 设置ScaleHeight 和 ScaleWidth;然后 设置自然坐标系原点坐标 (ox,oy),并 绘制坐标轴; 然后根据 Sin(x)和 Cos(x)函数绘制曲线,同时将曲线 坐标轴平移到(ox,oy)坐标原点处,注意纵坐 标轴向下为正方向。3在窗体上增加一个 Command 命令按钮 Command1,编写 Click 事件,设置 Picture1 的 AutoRedraw 属性为
11、 Ture,并调用绘图子过程,代 码如下:Private Sub Command1_Click()Picture1.AutoRedraw = Truedrawcurve Picture1End Sub程序运行结果如下图 7-2:图 7-2 程序运行结果例 2:将 PictureBox 控件上的面积分为(50*40) 个区域,在每个区域内绘制不同的色彩代表不同的温度,温度范围在 0-255 之间的随机数产生。1在上例中,在模块中增加一个函数 drawmap(pic As PictureBox, temp() As Integer, ByVal m As Integer, ByVal n As I
12、nteger),用于在PictureBox 控件上 绘制色彩代表温度,代码如下:工程应用培训教材Visual Basic 6.0 程序员培训教程 Public Sub drawmap(pic As PictureBox, temp() As Integer, ByVal m As Integer, ByVal n As Integer)Dim i, j As Integerpic.ScaleWidth = mpic.ScaleHeight = nFor i = 0 To m - 1For j = 0 To n - 1pic.Line (i, j)-(i + 1, j + 1), RGB(0,
13、temp(i, j), 0), BFNext jNext iEnd Sub2首先在窗体代码的通用部分增加 Option Explicit 告诉 VB 所有变量使用前必须加以声明,然后声明常数变量用于定义数组维 数,并在窗体的Load 事件中增加随机数发生器的初始化工作,代码如下:Option ExplicitConst m = 50Const n = 40Private Sub Form_Load()RandomizeEnd Sub3增加一个 Command 按钮 Command2,编写点击事件 Click 完成绘制图形,如下:Private Sub Command2_Click()Dim t
14、mp(m, n) As IntegerDim i, j As IntegerFor i = 0 To m - 1For j = 0 To n - 1tmp(i, j) = Int(255 * Rnd) + 1Next jNext i工程应用培训教材Visual Basic 6.0 程序员培训教程 Picture1.AutoRedraw = TrueCall drawmap(Picture1, tmp, m, n)End Sub程序运行结果如下图 7-3。图 7-3 程序运行结果例 3:编写程序,在窗体 Form1 上的 Picture1 绘图控件上绘 制一个直径为4500 的桶型的横截面,壁由
15、 3 层构成:外壁钢板(80)内部耐火转(120)内部皮层(180),要求:以圆心为原点的坐 标轴,不同色彩代表不同的窑壁材料,象征性的绘制窑砖堆砌形状。1在上面的例题中的 Module1 模块中,增加 绘制桶型横截面的子过程 drawcross(pic As PictureBox, ByVal d As Integer, ByVal x As Integer, ByVal y As Integer, ByVal z As Integer),pic 为绘图版变量, x 代表桶直径,x代表外壁厚,y 代表隔层耐火 砖, z 代表内部皮层厚度,代 码如下:Public Sub drawcross(
16、pic As PictureBox, ByVal d As Integer, ByVal x As Integer, ByVal y As Integer, ByVal z As Integer)Dim i As IntegerDim alpha As Singlepic.ScaleWidth = dpic.ScaleHeight = dpic.DrawMode = 13pic.DrawStyle = 0pic.Line (0, d / 2)-(d, d / 2)pic.Line (d / 2, 0)-(d / 2, d)工程应用培训教材Visual Basic 6.0 程序员培训教程 pic
17、.DrawWidth = x / 8pic.Circle (d / 2, d / 2), d / 2 - x, &HC00000pic.DrawWidth = y / 8pic.Circle (d / 2, d / 2), d / 2 - x - y, &HFF00&pic.DrawWidth = z / 8pic.Circle (d / 2, d / 2), d / 2 - x - y - z, &HFF&pic.DrawWidth = 2For i = 0 To 119 Step 1alpha = (i * 3 + 2) / 57.29578pic.Line (d / 2 + (d / 2
18、 - 2 * x - y) * Sin(alpha), d / 2 + (d / 2 - 2 * x - y) * Cos(alpha)-(d / 2 + (d / 2 - y) * Sin(alpha), d / 2 + (d / 2 - y) * Cos(alpha), vbBlackNext iEnd Sub程序首先进行画板的比例设置,然后 设置绘图方式,再后 绘 制桶截面,然后通过沿径向绘制直线的方式示意绘制砖型。2在窗体上增加一个命令按钮 Command 控件 Command3,编写 Click事件代码,调用绘制桶横截面的子 过程,代码如下:Private Sub Command3_
19、Click()Call drawcross(Picture1, 4500, 80, 120, 180)End Sub注意:绘制桶截面的过程函数, 对横截面砖的绘制有些问题 ,需要根据实际情况适当的调整绘制过程代码中的参数;在绘制代码中使用了 Circle 方法来绘制圆,为了使绘制桶壁厚度,使用了设置画板的 DrawWidth 属性为一定厚度的方式,也需要进行适当更改代码以适应不同的桶壁厚度。程序运行如下图 7-4工程应用培训教材Visual Basic 6.0 程序员培训教程 图 7-4 程序运行结果知识扩展:(1)获得坐标当前颜色我们经常需要知道绘图框上某一点的颜色值,以便用于 图 像处理,
20、 获取色彩代表的实验数据等等目的。确定颜色采用 Point 方法,确定颜色:Point(x, y)x, y 是想查看的点的水平(x-轴)和垂直(y- 轴)坐标,必须用括号包括这些值,(x, y)是 single 类型的数据。下列语句用来确定(10,9) 这个坐标点上的色彩赋给变量 myColor:myColor=Picture1. Point (10,9)(2)绘制图形文件绘制图形:PaintPicture picture, DestX, DestY, DestWidth, DestHeight, SourceX, SourceY, SourceWidth, SourceHeight, opc
21、ode用以在 Form,PictureBox 或 Printer 上绘制图形文件(.bmp、.wmf、.emf、.cur、.ico 或 .dib)的内容。下面介 绍各个参数的含义:PaintPicture 是 Picture 控件用于绘制图形的方法picture 是传送源,是图形框、 图象框或窗体的 Picture 属性,其内容是某个对象上的图形。DestX, DestY 均为单精度值,指定在某个 对象上绘制 picture 的目标坐标(x- 轴和 y-轴)。DestWidth 单精度值,指示 picture 的目标宽度。DestHeight 单精度 值,指示 picture 的目标高度。工程
22、应用培训教材Visual Basic 6.0 程序员培训教程 SourceX, SourceY 均为单精度值,指示 picture 内剪贴区的坐标(x-轴和 y-轴 )。SourceWidth 单精度值,指示 picture 内剪贴区的源高度。SourceHeight 单精度值,指示 picture 内剪贴区的源高度。opcode 是长型值或仅由位图使用的代码。它用来定义在将 picture 绘制到某个对象上时对 picture 执行的位操作(例如, vbMergeCopy 或 vbSrcAnd 操作符)。例如把图片框 1 上的图片绘制到图片框 2 上面(0,0)-(20,200)区域内:Picture2.PaintPicture Picture1.Picture, 0, 0, 200, 200, , , , ,VbSrcCopy培训练习:(1)编写程序,在窗体的绘图框上绘制 y=x*x-3*x+2 曲线,其中 x 在-3 到+5之间,要求绘出坐标轴及其方向。(2)编写程序,在窗体的绘图框上分为 50*40 个区域,并使用随机色彩填充 这些矩形。(3)编写一个程序绘制围棋棋盘(19*19),并在( 4,4),(4,15),(15,4),(15,15),(10,10),(4,10)(10,4),(15,10)(10,15)位置绘制围棋黑子标志。