VB程序设计 第十章图形操作Word文档下载推荐.docx
《VB程序设计 第十章图形操作Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《VB程序设计 第十章图形操作Word文档下载推荐.docx(59页珍藏版)》请在冰豆网上搜索。
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属性设置一览表
属性设置
单位
用户定义(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
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:
Y"
'
标记Y轴
说明:
可在程序中使用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)
PrivateSubCommand2_Click()'
用户定义
Form1.Scale(0,1000)-(1000,0)'
定义用户坐标系
[例10.1b]控件对象在坐标系内与X轴和Y轴的位置保持相对不变
[例10.1b]在myvb\vb10\ex10_1b\lbc10_1b.vpb
PrivateSubCoordinate()
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="
label4.Caption="
vbCrLf相当于chr(13)
Label2.Top=120:
Label2.Left=120
Label3.Top=3240:
Label3.Left=120
Label4.Top=120:
Label4.Left=5340
左移
结果坐标轴线和图形框向左上角推进渐渐从窗体上消失
Form1.ScaleLeft=100+Form1.ScaleLeft‘改变坐标系统
Form1.ScaleTop=100+Form1.ScaleTop
Coordinate'
调用子过程
右移
结果坐标轴线和图形框向右下角推进渐渐从窗体上消失
Form1.ScaleLeft=Form1.ScaleLeft–100‘改变坐标系统
Form1.ScaleTop=Form1.ScaleTop-100
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'
单击哪个按钮,哪个按钮就在最前面出现
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
\paste.bmp"
Case4
\OPEN.bmp"
EndSelect
Nexti
Command1(0).Picture=LoadPicture(App.Path+"
\save.bmp"
Command1(0).ToolTipText="
Command0"
[例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'
呈现白灯
PrivateSubPicture2_Click()'
OFF开关(白色)
Picture1.ZOrder0'
呈现红开关
Image1.ZOrder0'
呈现黄灯
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)
’置色
★"
6.2.2线宽与线型
窗体、图形框或打印机的DrawWidth属性给出在这些对象上所画线的宽度或点的大小。
DrawWidth属性以像素为单位来度量,最小值为1。
在窗体或图形框或打印机上用它们的的DrawStyle属性给出在这些对象上用画图方法所绘出线的形状(对线和形状控件所绘出的线、框不起作用)。
DrawStyle属性设置一览表
设置值
常量
线型
图示
vbSolid
实线(缺省)
vbDash
长划线
vbDot
点线
vbDashDot
点划线
vbDashDotDot
点点划线
vbInvisible
透明线
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)
[例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'
定义线的宽度
Line-Step(ScaleWidth/15,0)'
画线
Nextj
6.2.3填充与色彩
用图形方法绘制的封闭图形的填充方式由FillStyle、FillColor这两个属性决定。
(对形状控件绘出的封闭图形也适用)
FillColor指定填充图案的颜色,默认的颜色同ForeColor。
FillStyle指定填充的图案,共有8中内部图案。
FillStyle属性设置一览表
常数
说明
vbFSSolid
以FillColor绘制实心四方形
vbFSTransParent
透明(缺省值)
vbHorizontalLine
水平线
vbVerticalLine
垂直线
vbUpwardDiagonal
左上到右下斜线
vbDownwardDiagonal
右上到左下斜线
vbCross
网状格线
vbDiagonalCross
网状斜线
[例10.5]八种填充图案示例(用Line方法作图)
[例10.5]在myvb\vb10\ex10_5\lbc10_5.vpb
Dimx0%,x1%,y0%,k%,y1%
PrivateSubmnuClean_Click()'
擦除
x0=200:
x1=800:
k=100:
y0=200:
y1=800
PrivateSubForm_Load()‘准备初值
PrivateSubmnufillColor_Click()‘填充色
CommonDialog1.ShowColor
Form1.FillColor=CommonDialog1.Color
PrivateSubmnuvbCross_Click()'
FillStyle=vbCross
drawvbCross
PrivateSubmnuvbDiagonalCross_Click()'
FillStyle=vbDiagonalCross
drawvbDiagonalCross
PrivateSubmnuvbDownwardDiagonal_Click()'
FillStyle=vbDownwardDiagonal
drawvbDownwardDiagonal
PrivateSubmnuvbFSTransparent_Click()'
透明(缺省值)
FillStyle=vbFSTransparent
drawvbFSTransparent
PrivateSubmnuvbHorizontalLine_Cl