280 likes | 453 Views
重点难点和错误分析 —— 项目五 简易画图板. 主 讲 : 浙江广播电视大学 郑 炜. 一、保存图片文件及打开. 将图形保存到文件的语句: SavePicture 语法格式: SavePicture picture , stringexpression Picture : 产生图形文件的 PictureBox 控件或 Image 控件的图片内容 Stringexpression : 欲保存的图形文件名. 一、保存图片文件及打开. 例子:. Private Sub save_Click()
E N D
重点难点和错误分析——项目五 简易画图板 主 讲 :浙江广播电视大学郑 炜
一、保存图片文件及打开 • 将图形保存到文件的语句:SavePicture • 语法格式: SavePicture picture, stringexpression • Picture:产生图形文件的 PictureBox 控件或 Image 控件的图片内容 • Stringexpression:欲保存的图形文件名
一、保存图片文件及打开 • 例子: Private Sub save_Click() dlgFile.Filter = "BMP ILES(*.BMP)|*.BMP|_ JPG FILES(*.JPG)| *.JPG" dlgFile.ShowSave Fn = dlgFile.FileName If Fn <> "" Then SavePicture picPaintzone.Image, Fn End If End Sub
一、保存图片文件及打开 • 打开已存在的图形文件,在图形控件内显示图形内容。 • 格式: 图片框控件名.Picture=LoadPicture([filename]) • 当filename为一个文件的路径+文件名时,图片框控件加载了一个图形文件。 • 当filename为空时,清空(删除)图片框内的图形内容。
一、保存图片文件及打开 • 将图形按一定比例绘制在图片框控件内 • 格式: 图片框控件名.PaintPicturepicture, x, y, width, height • Picture:要绘制到 object 上的图形源 • x, y:均为单精度值,指定在 object 上绘制 picture 的目标坐标 • width, height:单精度值,指示 picture 的目标宽度和高度
一、保存图片文件及打开 • 例子: dlgFile.Filter = "BMP FILES(*.BMP)|*.BMP|JPG FILES(*.JPG)" dlgFile.ShowOpen If dlgFile.FileName <> "" Then picPaintzone.Picture = LoadPicture(dlgFile.FileName) Fn = dlgFile.FileName picPaintzone.PaintPicturepicPaintzone.Picture, 0, 0, _ picPaintzone.ScaleWidth, picPaintzone.ScaleHeight End If picPaintzone是“绘图区”,图片框控件
二、绘图方法 在应用程序中加进适当的图形和动画常常可以增加程序的魅力,使其多姿多彩。利用VB提供的绘图方法可以很容易地完成各种图形编程工作,Visual Basic的绘图方法如下: • Print 显示字符串 • Line 画直线和方框 • Circle 画圆或椭圆 • Point 取得点的颜色值 • Pset 设置点的颜色值
1、Line方法 • 在对象上画直线或矩形 • 语法格式: object.Line [Step] (x1, y1) [Step] (x2, y2),[color],[B][F] • Object:所绘直线的控件对象,例如Form、PictureBox等 • (x1, y1):所画线段的起点坐标 • (x2, y2):所画线段的终点坐标 • Color:可选的颜色参数 • [B][F]:B参数可选参数,利用对角坐标画出矩形;如果使用了 B 参数,则 F 参数规定矩形以矩形边框的颜色填充。
例 利用Line方法绘制直线或矩形 • 运用Line方法绘制窗体坐标系 Private Sub Form_Click() Cls Form1.Scale (-110, 110)-(110, -110) ' 定义坐标系 Line (-105, 0)-(105, 0) '画X轴 Line (0, 105)-(0, -105) '画Y轴 End Sub
例 利用Line方法绘制直线或矩形 • 运用Line方法在窗体坐标系内绘制矩形 Private Sub Form_Click() Cls Form1.Scale (-110, 110)-(110, -110) ' 定义坐标系 Line (-105, 0)-(105, 0) '画X轴 Line (0, 105)-(0, -105) ‘画Y轴 Line (-40, 40)-(40, -40), , B ' 画矩形 Line (-70, 40)-(-50, -40), vbRed, BF ' 画实心矩形 End Sub
2、Circle方法 • Circle方法用来绘制圆、椭圆、圆弧等图形 • 语法格式 [对象名.] Circle [Step](x,y),Radius, [Color] ,[Start],[End],[Aspet] • [对象名]:要绘制图形的容器对象名称,如窗体、图片框等,缺省时为当前窗体。 • (x,y):圆、椭圆、弧或扇形的圆心坐标。 • Radius:圆、椭圆、弧或扇形的半径,若为椭圆,则为最长轴的尺寸。
2、Circle方法 • Circle方法用来绘制圆、椭圆、圆弧等图形 • 语法格式 [对象名.] Circle [Step](x,y),Radius, [Color] ,[Start],[End],[Aspet] • [Start]:可选型,指定弧的起点位置。取值范围从-2π到2π,缺省值是0。若为负数,则在画弧的同时还要画出到弧的起点的连线。 • [End]:可选项,指定弧的终点位置。取值范围从-2Π到2Π,缺省值是2Π。若为负数,则在画弧的同时还要画出圆心到弧的终点的连线。弧的画法是从起点逆时针画到终点。
2、Circle方法 • 语法格式 [对象名.] Circle [Step](x,y),Radius, [Color] ,[Start],[End],[Aspet] • [Aspet]:可选项,圆的纵轴和横轴的尺寸比。缺省值为1,表示画一个标准圆。当纵横比大于1时,椭圆的纵轴比横轴长;反之,则比横轴短。
例 在窗体上绘制圆、圆弧等 • 绘制圆 Private Sub Form_Click() Cls '清屏 Const pi = 3.1415926 ScaleWidth = 100 ScaleHeight = 100 Circle (30, 30), 10 '画标准圆 End Sub
例 在窗体上绘制圆、圆弧等 • 绘制椭圆 Private Sub Form_Click() Cls '清屏 Const pi = 3.1415926 ScaleWidth = 100 ScaleHeight = 100 Circle (70, 30), 10, vbGreen, , , 0.5 '画绿色椭圆 Circle (70, 30), 10, vbRed, , , 2 '画红色椭圆 End Sub
例 在窗体上绘制圆、圆弧等 • 绘制圆弧和扇形 Private Sub Form_Click() Cls '清屏 Const pi = 3.1415926 ScaleWidth = 100 ScaleHeight = 100 Circle (30, 75), 10, , -0.75 * pi, -0.25 * pi '画扇区 Circle (75, 75), 10, , -0.25 * pi, -0.75 * pi '画扇区 Circle (75, 75), 10, , 1.25 * pi, 1.75 * pi '画弧 End Sub
三、鼠标事件 • MouseDown和MouseUp事件 • 语法格式: • Private Sub 控件对象名_MouseDown(Button As Integer, Shift As Integer, x As Single, Y As Single) • Private Sub 控件对象名_MouseUp(Button As Integer, Shift As Integer, x As Single, Y As Single)
MouseDown和MouseUp事件 • 语法格式: • Private Sub 控件对象名_MouseDown(Button As Integer, Shift As Integer, x As Single, Y As Single) • Button参数:可以用来区分当前鼠标的左、中、右按键,1表示用户按下了鼠标左按键,2表示右按键,4表示中间键。 • Shift参数:可以用来区别鼠标与键盘的组合,它的值等于1,表示Shift键被按下,2表示Ctrl键,4表示Alt键。 • X,Y参数:返回鼠标指针当前的位置,它们的计算单位由窗体的ScaleMode决定,由自定义坐标系统决定,如果没有自定义坐标系统,则按照默认坐标系。
示例1 • 当鼠标左键单击窗体时,按钮跟随鼠标位置移动;当鼠标右键单击窗体时,窗体内出现弹出菜单。
示例1 Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) If Button = 1 Then '单击鼠标左键时 Command1.Move X, Y ElseIf Button = 2 Then '单击鼠标右键时 PopupMenu edit, X, Y End If End Sub
MouseMove事件 • 语法格式: • Private Sub 控件对象名_MouseMove(Button As Integer, Shift As Integer, x As Single, Y As Single) • 参数与MouseDown、MouseUp一致
示例 • 设计程序,当鼠标在窗体内移动时,在鼠标指针当前位置画一个直径为100的圆,如图所示。 Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) Circle (X, Y), 100 End Sub
在项目中巧妙运用鼠标事件 • 运用MouseDown事件启动绘图,并绘制起点位置的图形,当鼠标按下后,将绘图区的绘图笔类型设置为异或笔(DrawMode = 7 ) • 运用MouseMove事件处理连续滑动鼠标绘制图形,当鼠标移动到新的位置,则先擦除在这一位置之前的坐标位置所成形的图形,然后再绘制新图形。
四、常见错误分析 • Form_Load事件内怎么无法绘制图形? • 如何清除已绘制的图形,例如线条? • 如何判定对象是否越出窗体的边界?
1、 Form_Load事件内怎么无法绘制图形? • 解决方法: • 用绘图方法在窗体上绘制图形时,如果将绘制过程放在Form_Load事件内,由于窗体装入内存有一个时间过程,在该时间段内同步地执行了绘图命令,所绘制的图形无法在窗体上显示。 • 有两种方法可解决此问题: • 方法一:将绘图程序代码放在其他事件内。例如Paint等事件。 • 方法二:将窗体的AutoRedraw属性设置为True。
2、如何清除已绘制的图形,例如线条? • 解决方法: • Line控件在窗体上移动时,原位置上不会留下图形痕迹。如果用Line方法来代替Line控件,则每次在新位置上画直线前,需要清除原来位置上的线条。清除原来位置上的线条,可将DrawMode属性设置为异或(Xor)模式,在原位置上重画一次直线,即可清除原来的线条。
3、如何判定对象是否越出窗体的边界? • 解决方法: • 当对象在窗体上移动时,对象是否越出窗体的上边界或左边界,不能用对象的Top<0或对象的Left<0来判断,对象的Top<0(Left<0)仅表示该控件对象的上边界越出窗体的上(左)边界,而要使整个控件越出窗体的上(左)边界,还需要加上控件的高度(宽度)。