Visual Basic程序设计导学06.docx
《Visual Basic程序设计导学06.docx》由会员分享,可在线阅读,更多相关《Visual Basic程序设计导学06.docx(31页珍藏版)》请在冰豆网上搜索。
VisualBasic程序设计导学06
第6章图形程序设计
Windows本身就具有良好的图形用户界面(GUI),Windows下的应用程序的一个重要特色就是图形处理。
VB提供了非常灵活的图形功能。
不仅可以通过图形控件进行图形和绘图操作,还可以通过图形方法在窗体或图片框上输出文字和图形。
本章将主要介绍有关图形程序设计的基本知识与方法。
6.1图形显示与绘图控件
在VB中,进行图形处理主要有三种方式:
·显示已经存在的图形
·使用绘图控件绘制图形
·用绘图方法绘制图形
6.1.1显示图形文件
图形文件可在窗体、图片框控件和图像控件这三种对象上显示。
图形文件可来自各种绘图程序,VB支持.bmp,.dib,.ico,.cur,.wmf,.emf,.jpg和.gif等格式的图形文件。
·Bitmap(位图)将图像定义为点(像素)的图案。
位图的文件扩展名是.bmp或.dib,可用多种颜色深度(包括2,4,8,16,24和32位),视当前的显示设备而定。
例如,每像素8位(256色)的位图在每像素4位(16色)的设备上只能显示出16种颜色。
·Icon(图标)是特殊类型的位图。
图标的最大尺寸为32像素×32像素,但在Windows95下,图标也可为16×16像素大小。
图标的文件扩展名为.ico。
·Metafile(图元文件)将图形定义为编码的线段和图形。
普通图元文件扩展名为.wmf。
增强型图元文件扩展名为.emf。
·JPEG是一种支持8位和24位颜色的压缩位图格式。
它是Internet上一种流行的文件格式。
·GIF最初是由CompuServe开发的一种压缩位图格式。
它可支持多达256种的颜色,是Internet上一种流行的文件格式。
1.图形显示控件
VB中的图形显示控件有Image控件和PictureBox控件。
·Image控件
Image(图像)控件只能用于显示已有的图形。
显示图形时,可通过设置其Picture属性来实现,既可在设计时设置Picture属性,也可在程序中通过LoadPicture()函数设置Picture属性,还可使用剪切板对象的GetData方法设置Picture属性。
·PictureBox控件
与Image不同,它不但可使用各种绘图方法画图和显示已存在的图形,也可用Print方法输出文本,还可以放置其他的控件对象,故又有小窗体之称。
此外,在MDI(多文档界面)窗体上,它是惟一可以直接放置在MDI主窗体上的控件,其他的控件只能放置在它上面(一般用来设计工具栏,用于放置工具按钮图标)。
2.图形显示方法
在应用程序中,可根据需要采用不同方式把图形添加到窗体、图片框或图像控件中。
(1)设计时添加图形
设计时添加图形有两种方法:
·使用对象的Picture属性。
在“属性”窗口的属性列表中选择Picture,VB将弹出一个对话框,从中可选择图形文件并把它加载到窗体上、图片框中或图像控件中。
·使用剪贴板。
把图形从另一个应用程序(如Windows95的画笔)复制到剪贴板上,然后返回VB环境,把它粘贴到窗体或图片框或图像控件中。
(2)运行时添加图形
运行时添加图片有三种方法:
·使用LoadPicture函数加载图形文件。
使用LoadPicure函数可以加载指定的图形文件,并将该图形赋给对象的Picture属性。
在不指定文件名时它还可用来清除窗体、图像或图片框中的图形。
其使用格式如下:
objectname.Picture=LoadPicture("[filename]")
其中,objectname为控件或窗体的Name属性值。
Filename为要加载的图形文件名全称,包括驱动器和路径。
在任何需要的时候,都可加载一新图形到窗体上、图片框中或图像控件里,以更新已有的图形。
当没有指定filename即括号中的参数为空串("")时,将清除该对象所显示的图形。
·使用Picture属性在对象间相互复制。
图形一旦被加载或粘贴到窗体、图片框或图像控件以后,运行时就可把它赋值给另一窗体、图片框或图像控件。
例如,下列语句将把名为picDisplay图片框中的图形复制到名为imgDisplay的图像控件内:
imgDisplay.Picture=picDisplay.Picture
·从剪贴板对象复制图形。
如果剪贴板中存储有图形数据,则可使用下面的语句将剪贴板中的图形赋给窗体、图片框或图形控件对象的Picture属性:
objectname.Picture=ClipBoard.GetData([format%])
提示:
如果是在设计时从文件中加载或粘贴图形,则图形就和窗体一起被保存和加载,在创建.exe文件时,就不必把源图形文件提供给用户,因为.exe文件本身包含有它的图像。
如果要在运行时用LoadPicture函数加载图形,则必须把源图形文件和应用程序一起提供给用户。
【例6.1】设计一个图形浏览器窗体,浏览并显示指定目录下的所有图形文件。
首先创建一个工程文件,添加一个窗体Form1,在其上放置一个图片框Picture1、图像框Image1和一个文件列表框File1。
在设计阶段将Picture1对象的AutoSize属性设置为True,Appearance属性设置为“0-Flat”,而Image1的Stretch属性设置为True,并将File1对象的Path属性设置为“e:
\media”,Pattern属性设置为“*.bmp;*.ico;*.cur;*.jpg”并在该窗体上设计如下事件过程:
DimfilepathAsString
PrivateSubFile1_Click()
Picture1.Picture=LoadPicture(filepath+"\"+File1.FileName)
Image1.Picture=Picture1.Picture
Form1.Picture=Picture1.Picture
EndSub
PrivateSubForm_Load()
filepath="e:
\media"
File1.Path=filepath
EndSub
启动本工程,出现Form1窗体,在文件列表框中单击一个图形文件,在窗体上、右边图片框和图像框中立即显示对应的图形,窗体左上方和右上方的图片框显示是实际大小的图形,而右下方的图像框是拉伸后的图形。
图6.1显示的是HAPPY.BMP文件的图形。
图6.1Form1窗体的执行界面
在File1_Click()事件过程中使用了LoadPicture()函数和Picture属性加载用户选择的图形。
从加载同一幅图形到图片框和图像控件的结果可以看出,被加载的图形均是从对象的左上角开始放置,窗体中和图片框(由于其AutoSize属性设置为True)的图形是原始图形文件的大小,图像中的图形被放大了。
这是由于三种不同对象显示图形的过程有差异,各有自己的特点。
(1)窗体中显示的图形是原始的图形,图形大于窗体时,多余的部分被剪切掉,图形小于窗体时,窗体的其余部分无图形可显示。
(2)图片框的AutoSize属性。
在加载图形的单击事件过程中,图片框的AutoSize属性(逻辑数据类型)可控制图片框是否适应图形的大小,以便调整。
如果想让图片框能自动扩展到可容纳新图片的大小,可将该图片框的AutoSize属性设置为True。
这样,在运行时加载或复制图形到图片框时,系统会自动调整其大小,使其恰好能够显示整个图片,不留多余的空白区域。
本例中由于将AutoSize属性设置为True,故图片框大小根据加载后的图形自动进行了调整,与设计时的大小不一样。
(3)图像的Stretch属性用来控制图形与控件谁适应谁的问题。
若将该属性设置为True,则图像控件大小一定,图形大小随图像控件而调整。
当Stretch属性为False时,图像控件自动调整其大小以适应加载图形的要求。
6.1.2使用绘图控件
在控件对象中,线条和形状可用于在设计时直接绘制界面所需的直线或有形状的(矩形、圆、椭圆、圆角矩形)图形。
1.线条控件
线条控件用于在设计阶段往窗体上绘制直线。
该控件与后面要讲的Line方法不同,前者在设计阶段就可看到效果,而后者只能待程序运行后才能将绘制的直线显示出来。
线条控件的基本属性如下:
·BorderCo1or属性,设置直线的颜色,可在程序中使用颜色函数QColor()或RGB()。
·BorderStyle属性,设置直线的样式。
·BorderWidth属性,设置直线的宽度,单位为像素。
【例6.2】设计一个窗体用线条控件在窗体上绘制一个长方体图形,并根据用户输入的边长计算该立方体的体积。
2.形状控件
形状控件提供了一种在窗体上绘制图形的方法,它可绘制的图形包括矩形、圆、椭圆、圆角矩形。
尽管说窗体或图片框的Line方法、Circle方法也可用来绘制矩形和圆形,但它们都是用在程序代码中,而用形状控件绘制的图形是在程序设计阶段都可看到的,因此,在某些情况下,用此控件可方便地改善用户程序的应用界面。
此外,该控件还可给其他控件加上边框等。
形状控件的一个重要的属性是Shape,用来设置形状控件的形状。
除与线条形状控件相同的属性外,下面的常用属性用来控制绘制图形的外观:
·FillColor属性,设置绘制图形的填充色。
·FillStyle属性,设置绘制图形的填充模式。
在上述工程中添加窗体Form2,如图6.2所示。
窗体左边是一个图片框,在其中用线条控件绘制一个立方体,窗体右边是一个框架,在其中放置4个标签、4个文本框和一个命令按钮command1,并在该命令按钮上设计如下事件过程:
PrivateSubCommand1_Click()
Text4.Text=Text1.Text*Text2.Text*Text3.Text
EndSub
图6.2Form2窗体设计界面
将本窗体设置成启动对象,执行本工程,出现Form2窗体的屏幕,在三条边长文本框中分别输入5、6和4,单击“计算体积”命令按钮,在体积文本框中显示120,如图6.3所示。
图6.3计算体积
6.2绘图方法
前面我们介绍了使用直线、形状等控件直接绘图,但有时我们需要在程序运行时使用绘图方法绘图,这是我们本节所要讨论的主要内容。
使用控件绘图的优点如下:
·使用较少的系统资源,运行速度快。
·设计阶段可预览图形效果。
·较短的代码。
·适合于窗体内需要较少的直线与圆等情况。
使用方法绘图的优点如下:
·适合于窗体内需要较多的直线或圆的情况。
·各直线或圆可重叠交叉使用,用控件绘图无法重叠。
在VB中提供的绘图方法见表6.1。
表6.1绘图方法
方法
说明
Cls
清除所有图形和Print输出
Pset
设置各个像素的颜色
Point
返回指定点的颜色值
Line
画线、矩形或填充框
Circle
画圆、椭圆或圆弧
PaintPicture
在任意位置画出图形
注意:
Print方法也可认为是一种绘制图形方法,因为它的输出也是写在对象上,并像Set,Line和Circle方法一样,也要以内存图像的方式进行保存(如果AutoRedraw是打开的)。
在介绍绘图方法之前,首先看一下绘图使用的坐标系统。
6.2.1坐标系统
对象的坐标系统是绘制各种图形的基础,坐标系统选择的恰当与否直接影响着绘图的质量,也就是说同样的绘图命令,可能仅仅由于用户定义或选择的坐标系统的不同,而不能正确地在屏幕上显示或在打印机上打印出结果来,或者即使能显示或打印出来,由于比例不协调,也达不到预期效果。
因此,在绘制图形前,必须首先确定坐标系。
1.默认坐标系及度量单位
我们知道,显示器是以像素(分辨率)为度量单位的。
常见显示器的分辨率为640×480、800×600、1024×768,同样一幅图形,由于使用的显示器分辨率不同,所显示的效果就不同。
因此在传统的图形设计中,常根据显示器分辨率来确定绘制图形的大小。
在VB中,系统提供了7种标准规格的坐标度量单位和一个由用户自定义的度量单位。
·默认坐标系系统默认的对象坐标系是以对象左上角为坐标原点(0,0),以twips(缇)为度量单位。
需要说明的是,只能在窗体或图片框上绘制图形,窗体的容器是系统对象Screen(屏幕),而窗体对象坐标系是用来度量其中的控件或绘制图形时用的。
·度量单位VB中共有8种度量单位,如表6.2所列。
除系统默认的度量单位twips外,用户还可根据需要,选择系统提供的其他标准度量单位。
度量单位设置是由对象(窗体或图片框)的ScaleMode属性定义的。
可在属性窗口设置或在程序代码中读取或修改。
表6.2VB的度量单位
ScaleMode
说明
0
用户自定义类型。
如果用户使用ScaleWidth,ScaleHeight,ScaleTop,ScaleLeft设置坐标系统,VB会自动设置ScaleMode为0
1
twips,此为默认值(每英寸为144twips)
2
磅,1英寸=72个磅
3
像素
4
字符,字符的宽度=120twips,字符的高度=240twips
5
英寸
6
毫米
7
厘米
2.用户定义对象坐标系统
在窗体和图片框中,与绘图有关的属性见表6.3。
表6.3与绘图有关的属性
属性
功能
CurrentX,CurrentY
设置或返回当前光标位置(窗体、图片框当前光标不可见)相对于窗体或图片框左上角为原点(0,0)的坐标
Height,Width
设置或返回窗体或图片框的高度和宽度,单位由容器而定
ScaleHeight,ScaleWidth
设置或返回窗体、图片框内部宽度和高度等分份数,这里的宽度和高度是指除去边界或标题行后的净宽度和净高度。
即用户定义坐标的单位
Left,Top
设置或返回窗体或图片框左上角在容器中的坐标值
ScaleLeft,ScaleTop
用于设置或返回窗体、图片框左上角的坐标值
注意:
不论窗体或图片框实际的尺寸有多大,都可以等分成若干份,等分的份数越多,说明宽度(高度)单位越小,反之越大。
因此用户可根据绘制图形数据的大小、范围来等分窗体或图片框成若干份,使绘图数据位于由用户定义的坐标范围内。
(1)用ScaleLeft,ScaleTop,ScaleHeight,ScaleWidth设置坐标系统
ScaleLeft和ScaleTop属性用于设置对象左上角坐标;ScaleHeight属性和ScaleWidth属性用于设置窗体或图片框的净高度和净宽度。
例如,在窗体Form1上绘制图形时,需要设置窗体左上角坐标为(10,20),右下角坐标为(60,50),则可使用下面的代码:
Form1.ScaleWidth=50
Form1.ScaleHeight=30
Form1.ScaleTop=20
Form1.ScaleLeft=10
坐标原点在(0,0)处,该窗体的位置如图6.4所示。
30
50
20
10
(0,0)
图6.4窗体位置
一旦设置了上述四个属性,则对象四个角的坐标为:
左上角:
(ScaleLeft,ScaleTop)
右下角:
(ScaleLeft+ScaleWidth,ScaleTop+ScaleHeight)
左下角:
(ScaleLeft,ScaleTop+ScaleHeight)
右上角:
(ScaleLeft+ScaleWidth,ScaleTop)
需说明的是,这四个属性的值也可以为负数。
例如,下面的代码可将窗体坐标原点定在左下角,向上和向右时坐标值增加,与平时所用坐标相似,右上角的坐标为(50,100),更符合于绘制各种曲线图的习惯。
ScaleLeft=20
ScaleTop=100
ScaleWidth=50
ScaleHeight=-100
例如,下面的代码可将坐标原点定在图片框Picture1的中心,其坐标位置如图6.5所示。
PrivateSubForm_Load()
Picture1.ScaleLeft=-15
Picture1.ScaleTop=-25
Picture1.ScaleWidth=30
Picture1.ScaleHeight=50
EndSub
(0,0)
(15,25)
X
(-15,-25)
(-15,25)
(15,-25)
Y
图6.5图片框位置
(2)用Scale方法定义坐标系统
Scale方法是用户定义对象坐标系统的实用方法,用它完全可以代替上面介绍的用ScaleTop,ScaleLeft,ScaleWidth,ScaleHeight属性定义坐标系统,且更方便。
使用此方法可直接定义对象的左上角坐标和右下角坐标值,一旦这两个角的坐标值确定,则另两个角坐标值也就定下来了。
Scale方法定义坐标系统格式如下:
[formname]|[pictureboxname].Scale[(x1,y1)-(x2,y2)]
其中(x1,y1)为左上角坐标,(x2,y2)为右下角坐标。
与上述四个属性对应关系为:
x1=ScaleLeft;y1=ScaleTop;x2=ScaleWidth+x1;y2=ScaleHeight+y1
当Scale后面不带参数时,使用默认的坐标系统,对象的左上角为原点(0,0)。
如绘制一曲线图,横坐标范围为2~15,纵坐标范围为0.5~1.5,则使用Scale方法,可定义窗体对象坐标系统:
Scale(0,2)-(20,0)。
6.2.2绘图方法
除了图形控件之外,VB还提供了一套绘图方法,它们适合于窗体和图片框。
1.PSet方法
PSet方法可以在窗体或图片框指定的位置用给定的色彩画一个“点”。
点的大小由对象的DrawWidth属性指定。
PSet方法的使用格式如下:
[formname]|pictureboxname.PSet[Step](x,y)[,color]
其中,(x,y)是画点的坐标。
color用来指定绘制点的颜色,数据类型为Long。
默认时,系统用对象的ForeColor属性值作为绘制点的颜色。
color参数还可用QBColor(),RGB()函数指定。
Step关键字是下一个画点位置相对于当前位置的偏移量的标记,即步长(水平、垂直两个方向,可正可负)。
(x,y)坐标值是相对于当前位置的偏移量。
【例6.3】设计一个窗体使用鼠标在其上任意绘制图形。
在本章工程中添加窗体Form3,其中不放置任何控件。
在该窗体上设计如下事件过程:
DimmouseAsBoolean'用于标识是否按下鼠标键
PrivateSubForm_Load()
mouse=False
Me.DrawWidth=2'设置绘制点的大小(宽度)
Me.ForeColor=vbRed'设置绘制点的颜色
EndSub
PrivateSubForm_MouseDown(ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)
mouse=True
Me.PSet(X,Y)
EndSub
PrivateSubForm_MouseMove(ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)
IfmouseThenMe.PSet(X,Y)
EndSub
PrivateSubForm_MouseUp(ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)
mouse=False
EndSub
将Form3窗体设置为启动对象,运行本工程,出现Form3窗体的空白屏幕,按下鼠标键拖动时,出现连续拖过的轨迹线,当释放鼠标时,轨迹线终止。
图6.6是用鼠标绘制的“PSet”字样。
图6.6Form3窗体执行界面
2.Line方法
Line方法用于在窗体或图片框对象上画直线(斜线也是直线)和矩形。
(1)直线
绘制直线时,应给出起点和终点坐标。
Line方法使用格式如下:
objectname.Line[[Step](x1,y1)]-[Step](x2,y2)[,color]
其中,Step表示其后的坐标值使用的是相对偏移。
(x1,y1)是直线的起点坐标,若前面有Step,则表示(x1,y1)是相对于当前位置的偏移量;否则(x1,y1)是相对于原点(0,0)的偏移量。
若省略(x1,y1),则起点为当前坐标位置(CurrentX,CurrentY)。
(x2,y2)是直线的终点坐标,若前面有Step,则表示(x2,y2)是相对于(x1,y1)的偏移量,否则(x2,y2)是相对于原点的绝对坐标值。
color指定要画直线的颜色。
可以使用颜色代码或颜色函数。
省略时用对象的ForeColor属性指定的颜色绘制直线。
画直线时,也是使用DrawWidth属性指定直线的宽度,使用DrawStyle属性指定边线的样式,其取值如表6.4所列。
表6.4DrawStyle属性设置
常量
设置值
说明
vbSolid
0
实线,默认设置
vbDash
1
虚线
vbDot
2
点线
vbDashDot
3
点划线
vbDashDotDot
4
双点划线
vbInvisible
5
无线
vbInsideSolid
6
内实线
【例6.4】设计一个窗体,用户使用鼠标在窗体点击时绘制随机大小和颜色的五角星。
在本章工程中添加窗体Form4,其中不放置任何控件。
在该窗体上设计如下事件过程:
Constpi=3.14159
PrivateSubstar(xAsSingle)
Randomize
n=Int(Rnd*16)
colr=QBColor(n)
Line-Step(x*Sin(pi/10),-x*Cos(pi/10)),colr
Line-Step(x*Sin(pi/10),x*Cos(pi/10)),colr
Line-Step(-x*Cos(2*pi/10),-x*Sin(2*pi/10)),colr
Line-Step(x,0),colr
Line-Step(-x*Cos(2*pi/10),x*Sin(2*pi/10)),colr
EndSub
PrivateSubForm_MouseUp(ButtonAsInteger,ShiftAsInteger,xAsSingle,yAsSingle)
PSet(x,y)
star(Rnd*2000)
EndSub
其中使用star子过程绘制一颗五角星,以五角星的左下角为起点,依次向上、右下、左上、右上,最后回到左下角,每个角的角度为2π/10,利用三角函数可以得到顶点的相对坐标。
Rnd()是随机函数,Randomize语句与随机函数一起使用,使产生的数更趋于随机。
将Form4窗体设置为启动对象,运行本工程,出现Form4窗体的空白屏幕,多次按下鼠标键时