VB程序设计 第十章图形操作.docx
《VB程序设计 第十章图形操作.docx》由会员分享,可在线阅读,更多相关《VB程序设计 第十章图形操作.docx(59页珍藏版)》请在冰豆网上搜索。
VB程序设计第十章图形操作
第十章图形操作
主要内容
●图形操作基础
●绘图属性
●图形控件
●图形方法
●应用
图形操作基础要点
默认坐标系
坐标系-用scale方法定义
属性:
ScaleLeft、ScaleTop、ScaleHeight、ScaleWidth、Top、Left、Height、Width
绘图属性要点
窗体和图形控件(PictureBox)有:
DrawWidth–用图形方法绘线的宽度
DrawStyle–用图形方法绘线的形状(DrawWidth=1时有效)
FillColor–用图形方法绘制封闭图形中的填充色
FillStyle–用图形方法绘制封闭图形的填充线方式(0-7共8种)
ForeColor-用图形方法绘制图形的边框颜色(图形方法的颜色参数设置优先)
形状控件Shape有:
Shape–选择控件的几何形状(0-5共6种)
BorderWidth–控件的边框线宽
BorderStyle–控件的边框线形状(BorderWidth=1时有效)
BorderColor–控件的边框颜色
FillColor–控件的填充线的颜色
FillStyle–控件中的填充图案样式
BackColor–控件图像的背景色(BackStyle属性应设置为不透明(opaque)才有效)
Line控件有
DrawMode–控件
BorderWidth–控件的线宽
BorderStyle–控件的线样式
BorderColor–控件的线颜色
X1-控线的起点坐标
Y1-控件的起点坐标
X2-控件的终点坐标
Y2-控件的终点坐标
公有属性
DrawMode–图形控件或图形方法的新像素和原有像素的组合方式(1-16共16种)
图形控件要点:
PictureBox(图形框)–重要属性Autosize、Picture装入图形方法LoadPicture
Image(图像框)–重要属性Stretch、Picture装入图形方法LoadPicture
Shape(形状)–重要属性Shap图形几何形状
Line(画线工具)
图形方法
Pset–画点
Line–画线
Cricle–画圆
Point–取点的颜色值
应用要点:
几何图形绘制
简单动画设计
图形漫游
图形处理技术
改变窗体外观
加入后台音乐
10.1图形操作基础
VisualBasic提供的图形控件主要有PictureBox(图形框)、Image(图像框)、Line(画线控件)、Shape(形状控件)。
提供的图形方法有Line、Circle、Pset和Point等。
为了方便图形操作,VisualBasic提供了系统标准坐标系和用户自定义坐标系两种方式的坐标系。
10.1.1坐标系统
每个容器都有一个坐标系,构成一个坐标系,需要三个要素:
坐标原点、坐标度量单位、坐标轴的长度与方向。
属性ScaleTop、ScaleLeft用于控制容器对象左边和顶端的坐标,根据这两个值来确定坐标原点。
所有对象的这两个属性的默认值为0,即坐标原点在对象的左上角。
属性ScaleHeight和ScaleWidth确定对象内部水平方向和垂直方向的单元数。
属性ScaleMode决定容器对象的坐标度量单位。
坐标系单位有8种形式。
缺省单位是Twip。
每英寸1440个Twip,20个Twip为一磅。
ScaleMode属性设置一览表
属性设置
单位
0
用户定义(User)
1
twip(默认值)
2
磅(point,每英寸72磅)
3
像素(pixed,与显示器分辨率有关)
4
字符(默认高为12磅,宽20磅的单位)
5
英寸(inch)
6
毫米(millimeter)
7
厘米(centimeter)
度量单位转换使用ScaleX和ScaleY方法,格式如下:
对象.ScaleX(转换值,原坐标单位,转换坐标单位)
对象.ScaleY(转换值,原坐标单位,转换坐标单位)
PrivateSubForm_Load()
x=ScaleX(45,1,7)‘将45由Twip转换成厘米7.937508E-02
y=ScaleY(45,1,6)‘将45由Twip转换成毫米0.7937508
MsgBoxx&""&y
EndSub
无论采用那种坐标度量单位,默认坐标原点在对象的左上角,横向向右为X轴的正向,纵向向下为Y轴的正向。
当新建一个窗体时,窗体采用默认坐标系,属性Height=3600(包括标题栏和水平边框的宽度),Width=4800(包括垂直边框的宽度)。
而属性ScaleLeft=0,ScaleTop=0,Scaleheight=3195,ScaleWidth=4680
10.1.2自行定义坐标系
方法一:
通过ScaleTop,ScaleLeft,ScaleWidth和ScaleHeight属性实现。
对象的左上角坐标为(ScaleLeft,ScaleTOP),右下角的坐标为(ScaleWidth+ScaleLeft,ScaleHeight+ScaleTop)
。
根据左上角和右下角坐标值的大小自动设置坐标轴的正向。
X轴与Y轴的度量单位分别是1/ScaleWidth和1/ScaleHeight。
方法二:
采用Scale方法来设置坐标系:
格式:
[对象.]Scale[(xLeft,yTop)-(xRight,yBotton)]
对象可以使窗体、图形框和打印机。
如省略对象名,则为带有焦点的窗体对象。
(xLeft,yTop)表示定义对象的左上角坐标,(xRight,yBotton)则表示定义对象的右下角坐标。
VB根据Scale方法给定的参数自动计算出对象的属性ScaleLeft、ScaleTop、ScaleHeight、ScaleWidth的值。
计算的方法如下
:
ScaleLeft=xLeft
ScaleTop=Ytop
ScaleHeight=yBottom-yTop
ScaleWidth=xRight-xLeft
由此式子可得出一个对象的ScaleHeight和ScaleWidth也可能是一个负值,但是对象的Width和Height属性值则不随Scale的定义而发生变化,永远保持一个正值。
[例10.1]在Form_Paint事件中定义窗体的坐标系。
[例10.1]在myvb\vb10\ex10_1\lbc10_1.vbp
PrivateSubForm_Load()
Cls
Form1.AutoRedraw=True
Form1.Scale(-200,250)-(300,-150)'在窗体中设置坐标系
Line(-200,0)-(300,0)'画X轴
Line(0,250)-(0,-150)'画Y轴
CurrentX=0:
CurrentY=0:
Print0'标记坐标原点
CurrentX=280:
CurrentY=40:
Print"X"'标记X轴
CurrentX=5:
CurrentY=240:
Print"Y"'标记Y轴
EndSub
说明:
可在程序中使用Scale方法改变坐标系统。
当Scale方法不带参数时,取消用户定义的坐标系,恢复缺省坐标系。
改变坐标系后产生的影响:
[例10.1a]观察画线Line(0,0)-(1000,1000)在不同坐标系中的效果
[例10.1a]在myvb\vb10\ex10_1a\lbc10_1a.vpb
PrivateSubCommand1_Click()'缺省坐标
Cls
Scale'采用缺省坐标系
'缺省坐标系(xLeft,yTop)=(ScaleTop,ScaleLeft)=(0,0)
'(xRight,yBottom)=(ScaleLeft+ScaleWidt,ScaleTop+ScaleHeight)=
'(4680,3195)
Line(0,0)-(1000,1000)
EndSub
PrivateSubCommand2_Click()'用户定义
Cls
Form1.Scale(0,1000)-(1000,0)'定义用户坐标系
Line(0,0)-(1000,1000)
EndSub
[例10.1b]控件对象在坐标系内与X轴和Y轴的位置保持相对不变
[例10.1b]在myvb\vb10\ex10_1b\lbc10_1b.vpb
PrivateSubCoordinate()
Cls
Line(0,0)-(5400,0)‘画线
Line(0,0)-(0,3800)
Label1.Caption="Form.ScaleLeft="&Form1.ScaleLeft&vbCrLf_
&"Form.ScaleTop="&Form1.ScaleTop
Picture1.Top=1080:
Picture1.Left=1080
'label2.Caption="0",label3.Caption="Y",label4.Caption="X",vbCrLf相当于chr(13)
Label2.Top=120:
Label2.Left=120
Label3.Top=3240:
Label3.Left=120
Label4.Top=120:
Label4.Left=5340
EndSub
PrivateSubCommand1_Click()'左移
'结果坐标轴线和图形框向左上角推进渐渐从窗体上消失
Form1.ScaleLeft=100+Form1.ScaleLeft‘改变坐标系统
Form1.ScaleTop=100+Form1.ScaleTop
Coordinate'调用子过程
EndSub
PrivateSubCommand2_Click()'右移
'结果坐标轴线和图形框向右下角推进渐渐从窗体上消失
Form1.ScaleLeft=Form1.ScaleLeft–100‘改变坐标系统
Form1.ScaleTop=Form1.ScaleTop-100
Coordinate'调用子过程
EndSub
10.1.3图形层
VB在构造图形时,在三个不同的屏幕层次上放置图形的可视组成部分。
就视觉效果而言,最上层离用户最近,而最下层离用户最远。
图形层放置的对象一览表
层次
对象类型
最上层
工具箱中除标签、线条、形状,image外的控件对象
中间层
标签、线条、形状控件对象和image
最下层
由图形方法所绘制的图形
位于上层的对象会覆盖下层相同位置的任何对象,即使下层对象在上层对象后面绘制。
处于同一图形层的对象的叠放顺序与操作有关,后绘在前绘上面。
同一图形层内控件对象排列顺序称为Z序列。
设计时可通过格式菜单中的顺序命令调整Z序列。
运行时可通过Zorder方法将特定的对象调整到同一图层的前面或后面。
如果控件不属于同一层,则Zorder方法无效。
Zorder方法的语法格式为:
对象.Zorder[position]
position=0表示该控件被定位于Z序列的前面
position=1表示该控件被定位于Z序列的后面
[例10.2]Zorder方法的使用
[例10.2]在myvb\vb10\ex10_2\lbc10_2.vpb
PrivateSubCommand1_Click(IndexAsInteger)'command1为命令按钮组
Command1(Index).ZOrder0'单击哪个按钮,哪个按钮就在最前面出现
EndSub
PrivateSubForm_Load()
Dimi
Fori=1To4
LoadCommand1(i)'设计命令按钮组
Command1(i).ToolTipText="Command"&i'给按钮加提示
Command1(i).Left=Command1(i-1).Left+250'确定出现位置
Command1(i).Top=Command1(i-1).Top+300
Command1(i).Visible=True'使其可见
'Command1(0).Style=1'命令按钮可以加载图标只允许在属性窗口设置
SelectCasei
Case1
Command1(i).Picture=LoadPicture(App.Path+"\Cut.bmp")
Case2
Command1(i).Picture=LoadPicture(App.Path+"\copy.bmp")
Case3
Command1(i).Picture=LoadPicture(App.Path+"\paste.bmp")
Case4
Command1(i).Picture=LoadPicture(App.Path+"\OPEN.bmp")
EndSelect
Nexti
Command1(0).Picture=LoadPicture(App.Path+"\save.bmp")
Command1(0).ToolTipText="Command0"
EndSub
[例10.2b]设计一个开关。
先画一个picture1控件在窗体上然后将开关(ON)图标装入Picture1内,因此Picture1控件的层次关系属于最底层,再在窗体上画一个picture2控件然后将开关(OFF)图标装入Picture2内,因此,Picture2对Picture1来说,图层属于上层。
这样,无论你怎样移动这两个控件OFF始终覆盖ON(只要重叠)。
[例10.2b]在myvb\vb10\ex10_2b\lbc10_2b.vpb
PrivateSubPicture1_Click()'ON开关(红色)
Picture2.ZOrder0'呈现白开关
Image2.ZOrder0'呈现白灯
EndSub
PrivateSubPicture2_Click()'OFF开关(白色)
Picture1.ZOrder0'呈现红开关
Image1.ZOrder0'呈现黄灯
EndSub
10.2绘图属性
10.2.1当前坐标
CurrentX,CurrentY属性给出窗体或图形框或打印机在绘图时的当前坐标。
这两个属性在设计阶段不能使用。
坐标(x,y)表示所在对象的绝对坐标,而Step(x,y)则表示在对象上的相对坐标位置,即从当前坐标平移x,y个单位,其绝对坐标为(CurrentX+x,CurrentY+y)。
使用Cls方法后,CurrentX=0,CurrentY=0
[例10.3]利用CurrentX,CurrentY属性在窗体上输出100个★。
[例10.3]在myvb\vb10\ex10_3\lbc10_3.vpb
PrivateSubForm_paint()'自动执行
DimiAsInteger
Randomize‘语句,每次运行产生不同序列的随机数
Fori=1To100CurrentX=Form1.Width*Rnd
CurrentY=Form1.Height*Rnd
Form1.ForeColor=RGB(CurrentX*Rnd,CurrentY*Rnd,Form1.Height*Rnd)
’置色
Print"★"
Nexti
EndSub
6.2.2线宽与线型
窗体、图形框或打印机的DrawWidth属性给出在这些对象上所画线的宽度或点的大小。
DrawWidth属性以像素为单位来度量,最小值为1。
在窗体或图形框或打印机上用它们的的DrawStyle属性给出在这些对象上用画图方法所绘出线的形状(对线和形状控件所绘出的线、框不起作用)。
DrawStyle属性设置一览表
设置值
常量
线型
图示
0
vbSolid
实线(缺省)
1
vbDash
长划线
2
vbDot
点线
3
vbDashDot
点划线
4
vbDashDotDot
点点划线
5
vbInvisible
透明线
6
vbInsideSolid
内实线
以上线型仅当DrawWidth属性值为1时才能产生。
当DrawWidth的值大于1且DrawStyle的值为1-4,都只能产生实线效果,而DrawStyle=6时,所画的内实线仅当是封闭线时起作用。
使用图形控件,则是通过BorderWidth属性定义线的宽度或点的大小,通过BorderStyle属性给出所画线的形状。
使用bordercolor属性置线色
[例10.4]线状示例(DrawWidth和DrawStyle)
[例10.4]在myvb\vb10\ex10_4\lbc10_4.vpb
PrivateSubForm_load()
Dimi%,y%,a%(0To6)
a(0)=vbSolid:
a
(1)=vbDash:
a
(2)=vbDot'赋线状常数
a(3)=vbDashDot:
a(4)=vbDashDotDot:
a(5)=vbInvisible
a(6)=vbInsideSolid
Form1.AutoRedraw=True'使用load事件必须有,否则不可画出线
DrawWidth=1'置线宽
Fori=0To6
DrawStyle=a(i)'置线状(即实、点、长点等线)
y=(300*i)+200
Form1.ForeColor=QBColor(i)'置色
Line(300,y)-(3000,y)
CurrentX=3020
Printi;a(i);Choose(i+1,"vbSolid","vbDash",_
"vbDot","vbDashDot","vbDashDotDot","vbInvisible","vbInsideSolid")
Nexti'从输出结果看,a(i)内是0-6的整数值
Line(100,2500)-(4000,2500)
DrawWidth=10'置线宽
Form1.ForeColor=RGB(0,192,0)
Line(400,2500)-(3000,2500)
EndSub
[例10.4a]改变DrawStyle属性值在窗体上画出不同形状的线形,通过改变DrawWidth属性值画一系列宽度递增的直线。
[例10.4a]在myvb\vb10\ex10_4a\lbc10_4a.vpb
PrivateSubForm_Click()
DimjAsInteger
CurrentX=0'设置开始位置
CurrentY=ScaleHeight/2
DrawWidth='定义线的宽度为1
Forj=0To6
DrawStyle=j'定义线的形状
ForeColor=QBColor(j)'设置颜色
Line-Step(ScaleWidth/15,0)'画线,Y坐标不动,X坐标相对移动ScaleWidth/15
Nextj
Forj=1To6
DrawWidth=j*3'定义线的宽度
ForeColor=QBColor(j)'设置颜色
Line-Step(ScaleWidth/15,0)'画线
Nextj
EndSub
6.2.3填充与色彩
用图形方法绘制的封闭图形的填充方式由FillStyle、FillColor这两个属性决定。
(对形状控件绘出的封闭图形也适用)
FillColor指定填充图案的颜色,默认的颜色同ForeColor。
FillStyle指定填充的图案,共有8中内部图案。
FillStyle属性设置一览表
设置值
常数
说明
0
vbFSSolid
以FillColor绘制实心四方形
1
vbFSTransParent
透明(缺省值)
2
vbHorizontalLine
水平线
3
vbVerticalLine
垂直线
4
vbUpwardDiagonal
左上到右下斜线
5
vbDownwardDiagonal
右上到左下斜线
6
vbCross
网状格线
7
vbDiagonalCross
网状斜线
[例10.5]八种填充图案示例(用Line方法作图)
[例10.5]在myvb\vb10\ex10_5\lbc10_5.vpb
Dimx0%,x1%,y0%,k%,y1%
PrivateSubmnuClean_Click()'擦除
Cls
x0=200:
x1=800:
k=100:
y0=200:
y1=800
EndSub
PrivateSubForm_Load()‘准备初值
x0=200:
x1=800:
k=100:
y0=200:
y1=800
EndSub
PrivateSubmnufillColor_Click()‘填充色
CommonDialog1.ShowColor
Form1.FillColor=CommonDialog1.Color
EndSub
PrivateSubmnuvbCross_Click()'网状格线
FillStyle=vbCross
drawvbCross
EndSub
PrivateSubmnuvbDiagonalCross_Click()'网状斜线
FillStyle=vbDiagonalCross
drawvbDiagonalCross
EndSub
PrivateSubmnuvbDownwardDiagonal_Click()'右上到左下斜线
FillStyle=vbDownwardDiagonal
drawvbDownwardDiagonal
EndSub
PrivateSubmnuvbFSTransparent_Click()'透明(缺省值)
FillStyle=vbFSTransparent
drawvbFSTransparent
EndSub
PrivateSubmnuvbHorizontalLine_Cl