vbnet程序设计实验010.docx
- 文档编号:28931186
- 上传时间:2023-07-20
- 格式:DOCX
- 页数:20
- 大小:187.47KB
vbnet程序设计实验010.docx
《vbnet程序设计实验010.docx》由会员分享,可在线阅读,更多相关《vbnet程序设计实验010.docx(20页珍藏版)》请在冰豆网上搜索。
vbnet程序设计实验010
实验十图形操作
一、实验目的
1.熟悉图形坐标系。
2.掌握绘图属性的用法。
3.掌握图形控件的用法。
4.掌握图形方法的应用。
二、实验内容
1.用图形控件制作奥运五环。
2.用绘图方法画坐标轴和动态正弦曲线。
3.用绘图方法画三维饼图。
4.用PaintPicture方法使图像翻转和缩放。
三、实验步骤及指导
1.用图形控件制作奥运五环
用Shape控件数组制作奥运五环,在五环下用Print方法显示“2008北京”。
(1)设计界面及设置属性
设窗体的背景色为白色。
在窗体上添加一个Shape控件,设其Index属性为0,Shape属性为3-Circle,BorderWidth属性为7。
(2)编写代码
在窗体的Form_Load事件中用Load方法添加Shape控件数组成员,设置其位置和颜色(BorderColor属性),构成奥运五环。
在五环下面,用Print方法显示“2008北京”字样。
程序运行界面如图10-1所示。
本实验项目更简单的做法是在设计界面时在窗体上放置五个Shape控件,适当调整其位置,按奥运五环的规定设置各控件的颜色(BorderColor属性)。
再添加一个标签,设BackStyle属性为1-Transparent,Caption属性为“2008北京”。
用这种方法不必编写代码。
图10-1奥运五环
运行时加载Shape控件数组成员以及在窗体特定位置打印文字的程序代码如下:
PrivateSubForm_Load()
DimiTop%,iLeft%,i%,j%,k%
iTop=Shape1(0).Top'环顶端坐标
iLeft=Shape1(0).Left+Shape1(0).Width'下一个环的左边坐标
Fori=1To2'外循环为行
Forj=1To2'内循环为列
k=(i-1)*2+j'求控件数组下标
LoadShape1(k)'添加控件数组对象
Shape1(k).Top=iTop'定位
Shape1(k).Left=iLeft
Shape1(k).Visible=True'显示
iLeft=iLeft+Shape1(0).Width'下一列位置
Nextj
iTop=iTop+Shape1(0).Width/2'下一行位置
iLeft=Shape1(0).Left+Shape1(0).Width/2
Nexti
Shape1(0).BorderColor=vbBlue'设颜色
Shape1
(2).BorderColor=vbRed
Shape1(3).BorderColor=vbYellow
Shape1(4).BorderColor=vbGreen
Me.AutoRedraw=True
Me.CurrentX=Shape1(3).Left+Shape1(3).Width/3'设打印坐标
Me.CurrentY=Shape1(3).Top+Shape1(3).Height+200
Print"2008北京"
EndSub
2.用绘图方法画坐标轴和动态正弦曲线
在图片框中用Line方法画出带有箭头的x轴和y轴。
单击“正弦信号”按钮时,在图片框中用PSet(画点)方法画出沿x轴波动的动态正弦曲线。
通过单选按钮调整画曲线的速度。
通过“停止/继续”按钮停止或继续画曲线的过程。
(1)设计界面及设置属性
在窗体上放置一个图片框,一个定时器,三个命令按钮,三个单选按钮(控件数组)。
控件属性设置如表10-1所示。
表10-1控件属性
对象
名称
属性名
属性值
对象
名称
属性名
属性值
OptionButton
optRate(0)
Caption
快速
CommandButton
cmdSin
Caption
正弦信号
optRate
(1)
Caption
中速
cmdStop
Caption
停止
optRate
(2)
Caption
慢速
cmdEnd
Caption
退出
PictureBox
picSin
Timer
tmrSin
(2)编写代码
程序代码的主要任务是画坐标轴以及画正弦曲线。
用Line方法画坐标轴。
创建一个以图片框对象为形参的自定义子过程,用于在图片框中画坐标轴。
在图片框中用Line方法分别画出x轴和y轴(上下左右各留出200缇的空间)。
在x、y坐标轴末端的两侧用Line方法各画一条短斜线即构成“箭头”。
调用该子过程的语句置于“正弦信号”按钮的单击事件过程中。
用PSet(画点)方法由点连线画出正弦曲线。
为了画出动态的正弦曲线,将画曲线的语句置于定时器的Timer事件(Interval=50)过程中。
画正弦曲线时应注意两个要点:
首先要确定画曲线的起始坐标;其次要求出所画新点的x和y坐标(用Sin函数根据x求y),该坐标是新点距起始坐标的偏移量。
用单选按钮选择画曲线的速度。
由于操作系统的限制,定时器控件的Interval属性值即使达到系统允许的最短间隔,画曲线的速度仍然显得非常缓慢。
解决这一矛盾的方法是在定时器事件中添加一个For循环,使每次Timer事件多画若干点。
定义一个模块级的变量,用于存放循环终值,在单选按钮的单击事件中改变循环终值的大小,即可调整画曲线的速度。
画曲线的暂停和继续。
通过“停止”按钮实现暂停和继续切换功能。
程序运行效果如图10-2所示。
(a)开始(b)单击“停止”后(c)单击“继续”后
图10-2正弦信号
程序代码如下:
OptionExplicit
DimintDegAsInteger
DimintRateAsInteger
'自定义过程:
画坐标轴,以图片框对象作形参
PrivateSubDrawAxis(picXAsPictureBox)
Dimx1AsInteger,y1AsInteger
Dimx2AsInteger,y2AsInteger
DimyAsInteger
picX.BackColor=vbBlack'黑色背景
picX.Cls
picX.DrawStyle=0'画线样式为实线
'定义坐标轴起止点
x1=200
x2=picX.ScaleWidth-200
y1=picX.ScaleHeight-200
y2=200
y=y1/2
'画坐标轴,QBColor(11)=亮青色
picX.Line(x1,y1)-(x1,y2),QBColor(11)'Y轴,自下而上
picX.Line(x1,y)-(x2,y),QBColor(11)'X轴,从左向右
'画Y轴箭头
picX.Line(x1-50,y2+120)-(x1,y2),QBColor(11)
picX.Line(x1+50,y2+120)-(x1,y2),QBColor(11)
'画X轴箭头
picX.Line(x2-120,y+50)-(x2,y),QBColor(11)
picX.Line(x2-120,y-50)-(x2,y),QBColor(11)
EndSub
PrivateSubcmdSin_Click()'正弦信号按钮
picSin.AutoRedraw=True'准备画持久图形
CallDrawAxis(picSin)'调用自定义过程画坐标轴
intDeg=1'设正弦曲线初始角度
tmrSin.Enabled=True'启动定时器
cmdStop.Caption="停止"
EndSub
PrivateSubcmdEnd_Click()'退出
End
EndSub
PrivateSubcmdStop_Click()'停止或继续
IfcmdStop.Caption="停止"Then
tmrSin.Enabled=False
cmdStop.Caption="继续"
Else
tmrSin.Enabled=True
cmdStop.Caption="停止"
EndIf
EndSub
PrivateSubForm_Load()'窗体加载
tmrSin.Interval=50'设置定时器
tmrSin.Enabled=False
optRate
(1).Value=True'初始速度为中速
intRate=8
EndSub
PrivateSubForm_Unload(CancelAsInteger)'窗体卸载
tmrSin.Enabled=False
EndSub
PrivateSuboptRate_Click(IndexAsInteger)'单选按钮控件数组单击事件
SelectCaseIndex'根据索引
Case0'快速
intRate=20
Case1'中速
intRate=8
Case2'慢速
intRate=2
EndSelect
EndSub
PrivateSubtmrSin_Timer()'定时器事件,用画点的方法画正弦曲线
DimxAsInteger,yAsInteger
DimscalYAsInteger
DimiAsInteger
scalY=picSin.ScaleHeight/4'Y轴最大值
'用循环调整画曲线的速度,循环次数在单选按钮的单击事件中设置
Fori=0TointRate
'设绘图起始坐标,新点以此坐标+偏移量画出
picSin.CurrentX=200
picSin.CurrentY=(picSin.ScaleHeight-200)/2
x=intDeg/180*scalY'取画点的x坐标
'Sin函数的参数要求用弧度,下面括号中的表达式将角度转换为弧度
'即:
弧度=角度*π/180.(intDeg变量中存放的是角度)
y=Sin(intDeg*3.14/180)*scalY'取画点的y坐标
'用PSet(画点)方法画曲线。
Y轴方向默认向下,为使曲线开始时向上,y取负值
'使用Step关键字时,x,y表示所画新点距起始坐标的偏移量
picSin.PSetStep(x,-y),vbYellow
intDeg=intDeg+1'角度+1
'若曲线画到图片框右边界,回到起点重画
IfpicSin.CurrentX>=picSin.ScaleWidthThencmdSin_Click
Next
EndSub
3.画三维饼图
若以一个圆的面积表示事物的总体,以扇形的面积表示各部分占总体的百分数,则这种图形称为扇形统计图,又叫做百分比较图。
三维饼图是扇形统计图的三维表示形式(圆饼实际上是一个较矮的圆柱),常用于直观地显示事物总体中各部分的百分比。
本实验项目要求统计某单位技术人员中的初级、中级和高级职称人员所占百分比,并且用三维饼图显示。
(1)设计界面及设置属性
在窗体上放置一个图片框,背景色为白色。
添加一个框架,设Caption属性为“输入各级职称人数”。
在框架中添加含有三个成员的文本框控件数组,设Text属性为空。
再添加三个标签,Caption属性分别为“初级”、“中级”和“高级”。
在窗体上添加两个命令按钮,Caption属性分别为“显示三维饼图”和“退出”。
(2)编写代码
程序代码主要是处理“显示三维饼图”按钮的单击事件。
在事件过程中定义一个一维单精度数组arRank,下界为0,上界为2(与各文本框的Index属性对应)。
定义一个单精度变量sTotal,用于存放人员总数。
通过For循环将用户在文本框中输入的数据存入数组,并将累加值存入sTotal,然后将各类人员数除以人员总数得出人员比例再存入数组中。
为了便于对程序进行修改和调试,同时使读者了解如何创建和使用以数组作为参数的自定义过程,在本实验项目中要求将画饼图的程序段设计为自定义子过程,在按钮的单击事件中以数组arRank作为实参调用该过程。
在画圆饼的子过程中要解决的的主要技术问题是:
要使圆饼(柱)看上去更加真实,须将圆饼的底面画成椭圆形;利用循环自下而上画出一系列由不同颜色的扇形拼接构成的椭圆,形成三维圆饼效果;在圆饼的上底面勾画出扇形的边缘(一般用黑色);将圆饼侧面与底面扇形对应部分的颜色设为与底面扇形色彩相近的较深颜色;勾画出整个圆饼的轮廓线以及相邻扇形在圆柱侧面的分隔线(黑色);显示图例。
用Circle方法和Line方法可以完成上述任务。
具体实现步骤请参考源代码。
程序运行效果如图10-3所示。
图10-3三维饼图
程序代码如下:
OptionExplicit
'自定义过程:
画饼图。
形参为数组。
PrivateSubDrawCake(Ar()AsSingle)
ConstPI=3.1415926
DimiAsInteger,sngRatioAsSingle
DimCXAsSingle,CYAsSingle,CRAsSingle
CX=1500'设置圆心坐标和半径
CY=1000
CR=1000
sngRatio=0.4'椭圆纵横比
Picture1.Cls
Picture1.FillStyle=0'0=vbFSSolid,实线
'每次循环根据各职称比例画三个扇形构成椭圆
'自下而上画200个同样的图形可形成三维饼图(圆柱)效果
Fori=1To200
IfAr(0)>0#Then'初级
Picture1.FillColor=RGB(128,0,0)'暗红色填充
'画扇形。
扇形轮廓线的颜色比填充色略深。
Picture1.Circle(CX,CY-i),CR,RGB(100,0,0),_
-2*PI,-2*PI*Ar(0),sngRatio
EndIf
IfAr
(1)>0#Then'中级
IfAr(0)=0#ThenAr(0)=0.0000001
Picture1.FillColor=RGB(192,192,255)'浅蓝灰色填充
Picture1.Circle(CX,CY-i),CR,RGB(150,150,255),_
-2*PI*Ar(0),-2*PI*(Ar(0)+Ar
(1)),sngRatio
EndIf
IfAr
(2)>0#Then'高级
Picture1.FillColor=RGB(255,255,192)'浅黄色填充
Picture1.Circle(CX,CY-i),CR,RGB(240,240,0),_
-2*PI*(Ar(0)+Ar
(1)),-2*PI,sngRatio
EndIf
Next
Picture1.FillStyle=1'1=vbFSTransparent,透明
Picture1.Circle(CX,CY),CR,vbBlack,PI,0,sngRatio'饼图下缘弧线
CY=CY-200
'最上面的扇形
Picture1.Circle(CX,CY),CR,vbBlack,-2*PI,-2*PI*Ar(0),sngRatio
Picture1.Circle(CX,CY),CR,vbBlack,-2*PI*Ar(0),_
-2*PI*(Ar(0)+Ar
(1)),sngRatio
Picture1.Circle(CX,CY),CR,vbBlack,-2*PI*(Ar(0)+Ar
(1)),_
-2*PI,sngRatio
'圆柱两侧的竖线
Picture1.Line(500,CY)-(500,CY+250)
Picture1.Line(2500,CY)-(2500,CY+250)
'利用椭圆参数方程画相邻扇形在圆柱侧面的分隔线
DimaAsSingle
IfAr(0)>0.5Then
a=2*PI*Ar(0)
CX=CR*Cos(a)+CX
CY=CY-CR*sngRatio*Sin(a)
Picture1.Line(CX,CY)-(CX,CY+210)
EndIf
CX=1500:
CY=800
IfAr(0)+Ar
(1)>0.5Then
a=2*PI*(Ar(0)+Ar
(1))
CX=CR*Cos(a)+CX
CY=CY-CR*sngRatio*Sin(a)
Picture1.Line(CX,CY)-(CX,CY+210)
EndIf
'显示图例
Ar(0)=Val(Format(Ar(0)*100,"0.0"))
Ar
(1)=Val(Format(Ar
(1)*100,"0.0"))
Ar
(2)=100-Ar(0)-Ar
(1)
Picture1.FillStyle=0
Picture1.FillColor=RGB(128,0,0)
Picture1.Line(1000,2000)-(1150,1850),,B
Picture1.Print"初级";Ar(0)&"%"
Picture1.FillColor=RGB(192,192,255)
Picture1.Line(1000,2200)-(1150,2050),,B
Picture1.Print"中级";Ar
(1)&"%"
Picture1.FillColor=RGB(255,255,192)
Picture1.Line(1000,2400)-(1150,2250),,B
Picture1.Print"高级";Ar
(2)&"%"
EndSub
PrivateSubCommand1_Click()'“显示三维饼图”按钮
DimarRank
(2)AsSingle,sTotalAsSingle
DimiAsInteger,jAsInteger
Fori=0To2'将各文本框中的数据存入数组
arRank(i)=Val(Text1(i).Text)
IfarRank(i)=0Thenj=j+1
sTotal=sTotal+arRank(i)
Next
IfsTotal=0Orj>1ThenExitSub'至少应有两个数据
Fori=0To2'将人数转换为比例
arRank(i)=arRank(i)/sTotal
Next
CallDrawCake(arRank)'调用画图过程,实参为数组
EndSub
PrivateSubCommand2_Click()'退出
End
EndSub
PrivateSubForm_Load()
Picture1.AutoRedraw=True
EndSub
PrivateSubText1_GotFocus(IndexAsInteger)
Text1(Index).SelStart=0
Text1(Index).SelLength=Len(Text1(Index).Text)
EndSub
PrivateSubText1_KeyPress(IndexAsInteger,KeyAsciiAsInteger)
IfNotIsNumeric(Chr(KeyAscii))AndKeyAscii<>8Then
KeyAscii=0'若按键非数字键或回删键,取消按键
EndIf
EndSub
4.图像翻转
用PaintPicture方法复制图像,通过改变PaintPicture方法中的参数(坐标、高度和宽度)使图像伸缩,模拟图像水平或垂直“旋转”效果。
(1)设计界面及设置属性
在工程中设置三个窗体,窗体Form2和Form3不放置控件,用于显示被复制的图像。
在Form1上添加一个图片框,命名为picF,通过图片框的Picture属性为其加载一幅图片。
添加两个框架,每个框架中添加两个命令按钮,Frame1中按钮的Caption属性分别为“水平旋转”和“停止”;Frame2中按钮的Caption属性分别为“垂直旋转”和“停止”。
在窗体上添加一个命令按钮,Caption属性为“退出”。
在窗体上添加两个定时器。
(2)编写代码
本程序的核心语句是调用窗体的PaintPicture方法实现图像的复制、翻转、伸缩。
PaintPicture方法的格式如下:
目标对象.PaintPicture源图像,dx,dy[,dw,dh,sx,sy,sw,sh,组合模式]
如果只是图像的简单复制,调用PaintPicture方法时只带有必选参数(源图像,目标图像的坐标dx、dy)即可,其他可选参数均忽略。
本实验项目要求在复制图像的同时使图像产生水平或垂直旋转的效果,因此,除了必选参数外,还需用到目标图像的宽度(dw)和高度(dh)两个可选参数。
将dw或dy设为负值,可实现图像的水平或垂直翻转。
动态改变dx、dy、dw和dh的大小,可以模拟图像水平或垂直“旋转”的效果。
为了使图像有规律地“旋转”,可将PaintPicture方法的调用放在定时器控件的Timer事件过程中。
在程序代码中应当注意控制dw和dh的极限值,二者的绝对值最好分别控制在图像的原始宽度和高度以内。
程序部分运行效果如图10-4所示。
(a)原始图像(b)垂直翻转(c)水平翻转(d)正在“旋转”
图10-4图像的水平和垂直“旋转”
程序代码如下:
'Form1程序代码
OptionExplicit
DimiZoomAsInteger
DimiWAsInteger,HorXAsInteger,FlagWAsInteger
DimiHAsInteger,VertYAsInt
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- vbnet 程序设计 实验 010