重点难点和错误分析——项目五简易画图板.pptx
一、保存图片文件及打开将图形保存到文件的语句:SavePicture语法格式:SavePicturepicture,stringexpressionPicture:产生图形文件的PictureBox控件或Image控件的图片内容Stringexpression:欲保存的图形文件名第1页/共28页一、保存图片文件及打开例子:Private Sub save_Click()dlgFile.Filter=BMP ILES(*.BMP)|*.BMP|_ JPG FILES(*.JPG)|*.JPGdlgFile.ShowSaveFn=dlgFile.FileNameIf Fn Then SavePicture picPaintzone.Image,FnEnd IfEnd Sub第2页/共28页一、保存图片文件及打开打开已存在的图形文件,在图形控件内显示图形内容。格式:图片框控件名.Picture=LoadPicture(filename)当filename为一个文件的路径文件名时,图片框控件加载了一个图形文件。当filename为空时,清空(删除)图片框内的图形内容。第3页/共28页一、保存图片文件及打开将图形按一定比例绘制在图片框控件内格式:图片框控件名.PaintPicturepicture,x,y,width,heightPicture:要绘制到object 上的图形源x,y:均为单精度值,指定在object上绘制picture的目标坐标width,height:单精度值,指示picture的目标宽度和高度第4页/共28页一、保存图片文件及打开例子:dlgFile.Filter=BMP FILES(*.BMP)|*.BMP|JPG FILES(*.JPG)dlgFile.ShowOpenIf dlgFile.FileName Then picPaintzone.Picture=LoadPicture(dlgFile.FileName)Fn=dlgFile.FileName picPaintzone.PaintPicture picPaintzone.Picture,0,0,_ picPaintzone.ScaleWidth,picPaintzone.ScaleHeightEnd IfpicPaintzone是“绘图区”,图片框控件第5页/共28页二、绘图方法在应用程序中加进适当的图形和动画常常可以增加程序的魅力,使其多姿多彩。利用VB提供的绘图方法可以很容易地完成各种图形编程工作,VisualBasic的绘图方法如下:Print显示字符串Line画直线和方框Circle画圆或椭圆Point取得点的颜色值Pset设置点的颜色值第6页/共28页1、Line方法在对象上画直线或矩形语法格式:object.LineStep(x1,y1)Step(x2,y2),color,BFObject:所绘直线的控件对象,例如Form、PictureBox等(x1,y1):所画线段的起点坐标(x2,y2):所画线段的终点坐标Color:可选的颜色参数BF:B参数可选参数,利用对角坐标画出矩形;如果使用了B参数,则F参数规定矩形以矩形边框的颜色填充。第7页/共28页例 利用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第8页/共28页例 利用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第9页/共28页2、Circle方法Circle方法用来绘制圆、椭圆、圆弧等图形语法格式对象名.CircleStep(x,y),Radius,Color,Start,End,Aspet对象名:要绘制图形的容器对象名称,如窗体、图片框等,缺省时为当前窗体。(x,y):圆、椭圆、弧或扇形的圆心坐标。Radius:圆、椭圆、弧或扇形的半径,若为椭圆,则为最长轴的尺寸。第10页/共28页2、Circle方法Circle方法用来绘制圆、椭圆、圆弧等图形语法格式对象名.CircleStep(x,y),Radius,Color,Start,End,AspetStart:可选型,指定弧的起点位置。取值范围从-2到2,缺省值是0。若为负数,则在画弧的同时还要画出到弧的起点的连线。End:可选项,指定弧的终点位置。取值范围从-2到2,缺省值是2。若为负数,则在画弧的同时还要画出圆心到弧的终点的连线。弧的画法是从起点逆时针画到终点。第11页/共28页2、Circle方法语法格式对象名.CircleStep(x,y),Radius,Color,Start,End,AspetAspet:可选项,圆的纵轴和横轴的尺寸比。缺省值为1,表示画一个标准圆。当纵横比大于1时,椭圆的纵轴比横轴长;反之,则比横轴短。第12页/共28页例 在窗体上绘制圆、圆弧等绘制圆Private Sub Form_Click()Cls 清屏 Const pi=3.1415926 ScaleWidth=100 ScaleHeight=100 Circle(30,30),10 画标准圆End Sub第13页/共28页例 在窗体上绘制圆、圆弧等绘制椭圆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第14页/共28页例 在窗体上绘制圆、圆弧等绘制圆弧和扇形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第15页/共28页三、鼠标事件MouseDown和MouseUp事件语法格式:PrivateSub控件对象名_MouseDown(ButtonAsInteger,ShiftAsInteger,xAsSingle,YAsSingle)PrivateSub控件对象名_MouseUp(ButtonAsInteger,ShiftAsInteger,xAsSingle,YAsSingle)第16页/共28页MouseDown和MouseUp事件 语法格式:PrivateSub控件对象名_MouseDown(ButtonAsInteger,ShiftAsInteger,xAsSingle,YAsSingle)Button参数:可以用来区分当前鼠标的左、中、右按键,1表示用户按下了鼠标左按键,2表示右按键,4表示中间键。Shift参数:可以用来区别鼠标与键盘的组合,它的值等于1,表示Shift键被按下,2表示Ctrl键,4表示Alt键。X,Y参数:返回鼠标指针当前的位置,它们的计算单位由窗体的ScaleMode决定,由自定义坐标系统决定,如果没有自定义坐标系统,则按照默认坐标系。第17页/共28页示例1当鼠标左键单击窗体时,按钮跟随鼠标位置移动;当鼠标右键单击窗体时,窗体内出现弹出菜单。第18页/共28页示例1Private 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 IfEnd Sub第19页/共28页MouseMove事件 语法格式:PrivateSub控件对象名_MouseMove(ButtonAsInteger,ShiftAsInteger,xAsSingle,YAsSingle)参数与MouseDown、MouseUp一致第20页/共28页示例设计程序,当鼠标在窗体内移动时,在鼠标指针当前位置画一个直径为100的圆,如图所示。Private Sub Form_MouseMove(Button As Integer,Shift As Integer,X As Single,Y As Single)Circle(X,Y),100End Sub第21页/共28页在项目中巧妙运用鼠标事件运用MouseDown事件启动绘图,并绘制起点位置的图形,当鼠标按下后,将绘图区的绘图笔类型设置为异或笔(DrawMode=7)运用MouseMove事件处理连续滑动鼠标绘制图形,当鼠标移动到新的位置,则先擦除在这一位置之前的坐标位置所成形的图形,然后再绘制新图形。第22页/共28页四、常见错误分析Form_Load事件内怎么无法绘制图形?如何清除已绘制的图形,例如线条?如何判定对象是否越出窗体的边界?第23页/共28页1、Form_Load事件内怎么无法绘制图形?解决方法:用绘图方法在窗体上绘制图形时,如果将绘制过程放在Form_Load事件内,由于窗体装入内存有一个时间过程,在该时间段内同步地执行了绘图命令,所绘制的图形无法在窗体上显示。有两种方法可解决此问题:方法一:将绘图程序代码放在其他事件内。例如Paint等事件。方法二:将窗体的AutoRedraw属性设置为True。第24页/共28页2、如何清除已绘制的图形,例如线条?解决方法:Line控件在窗体上移动时,原位置上不会留下图形痕迹。如果用Line方法来代替Line控件,则每次在新位置上画直线前,需要清除原来位置上的线条。清除原来位置上的线条,可将DrawMode属性设置为异或(Xor)模式,在原位置上重画一次直线,即可清除原来的线条。第25页/共28页3、如何判定对象是否越出窗体的边界?解决方法:当对象在窗体上移动时,对象是否越出窗体的上边界或左边界,不能用对象的Top0或对象的Left0来判断,对象的Top0(Left0)仅表示该控件对象的上边界越出窗体的上(左)边界,而要使整个控件越出窗体的上(左)边界,还需要加上控件的高度(宽度)。第26页/共28页谢谢!第27页/共28页感谢您的观看!第28页/共28页