第十章图形操作PrivateSubForm_Paint()ClsForm1.Scale(-200,250)-(300,-150)Line(-200,0)-(300,0)Line(0,-150)-(0,250)CurrentX=0:CurrentY=0:Print0CurrentX=280:CurrentY=20:PrintxCurrentX=10:CurrentY=240:PrintyCircle(0,0),100EndSub10.1图形操作基础10.1.1坐标系统每个容器都有一个坐标系,构成一个坐标系,需要三个要素:坐标原点、坐标度量单位、坐标轴的长度与方向。坐标度量单位由容器对象的ScaleMode属性决定。缺省时为Twip。每英寸1440个Twip,20个Twip为一磅。10.1.2自行定义坐标系方法一:通过ScaleTop,ScaleLeft,ScaleWidth和ScaleHeight属性实现。方法二:采用Scale方法来设置坐标系:[对象.]Scale[(xLeft,yTop)-(xRight,yBotton)]例如,Form1.Scale(-200,250)-(300,-150)将建立和例10.1一样的坐标系。可在程序中使用Scale方法改变坐标系统。当Scale方法不带参数时,取消用户定义的坐标系,采用缺省坐标系。改变坐标系后产生的影响:10.1.3图形层利用图形层的特点,实现悬浮效果。同一图形层内控件对象排列顺序称为Z序列。Zorder方法的语法为:对象.Zorder[position]position=0表示该控件被定位于Z序列的前面;position=1表示该控件被定位于Z序列的后面。10.2绘图属性10.2.1当前坐标CurrentX,CurrentY属性给出窗体或图形框或打印机在绘图时的当前坐标。这两个属性在设计阶段不能使用。10.2.2线宽与线型窗体、图形框或打印机的DrawWidth属性给出这些对象上所画线的宽度或点的大小。DrawWidth属性以像素为单位来度量,最小值为1。例10.3用DrawWidth属性改变直线宽度。窗体或图形框或打印机的DrawStyle属性给出这些对象上所画线的形状。10.2.3填充与色彩三个图形层放置的对象层次对象类型最上层工具箱中除标签、线条、形状外的空件对象中间层工具箱中标签、线条、形状空件对象最下层由图形方法所绘制的图形设置值线型图示0实线(缺省)1长划线2点线3点划线4点点划线5透明线6内实线VisualBasic默认采用对象的前景色(ForeColor属性)绘图,也可以通过以下颜色函数指定色彩。1.RGB(红,绿,蓝)函数红、绿、蓝三基色使用0~255之间的整数。2.QBColor(颜色码)颜色码使用0~15之间的整数。10.3图形控件10.3.1PictureBox(图形框)主要作用:显示图片、也可作为其他控件的容器。装入图形:图形框对象.Picture=LoadPicture(“图形文件名”)删除图形:图形框对象.Picture=LoadPicture()Autosize属性设置为True时,图形框能自动调整大小与显示的图片匹配。10.3.2Image(图像框)图像框比图形框占用更少的内存块。图像框内不能保存其他控件。Stretch属性=False,图像框可自动改变大小,以适应其中的图形。Stretch属性=True,图形可自动调整尺寸,以适应图像框的大小。例10.5图形框Autosize属性与图像框的Stretch属性对加载图形的影响。SavePicture对象名.属性,文件名把绘制或装在窗体、图形框和图像框内的图形保存到Bmp格式文件内。10.3.3Line(画线工具)10.3.4Shape(形状)10.4图形方法10.4.1Line方法画直线或矩形:[对象.]Line[[Step](x1,y1)]-(x2,y2)[,颜色][,B[F]]其中:对象可以是窗体或图形框。(x1,y1),(x2,y2)为线段的起终点坐标或矩形的左上角右下坐标。关键字B表示画矩形,关键字F表示用画矩形的颜色来填充矩形。例10.8用Line方法在一个窗体上画坐标轴与坐标刻度。例10.9用Line方法在一个窗体上画随机射线。10.4.2Circle方法Circle方法用于画圆、椭圆、圆弧和扇形。10.4.3Pset方法Pset方法用于画点:[对象.]Pset[Step](x,y)[,颜色]参数(x,y)为所画点的坐标,关键字Step表示采用当前作图位置的相对值。例10.10本例用Pset方法绘制阿基米德螺线10.4.4Point方法Point方法用于返回指定点的RGB颜色,其语法格式如下:[对象.]Point(x,y)其中参数对象与(x,y)的意义与前述相同。如果(x,y)点位于对象之外,Point方法将返回True。例10.11用Point方法获取一个区域的信息。利用例10.11的处理方法可使图片产生朦胧的效果。10.5应用10.5.1几何图形绘制利用Line方法和Circle方法及DrawWidth、DrawStyle和DrawMode属性。例10.12用Circle方法在窗体上绘制由圆环构成的艺术图案。算法:等分半径为r的圆周为n份,以等分点为圆心,半径r1绘制n个圆。例10.13用Line方法绘制函数f(x)=x2在区间[a,b]之间积分面积图。为了能绘制任意区间[a,b]上函数f(x)积分面积图,可在窗体上放置一个图形框和两个文本框。文本框用于指定积分上下限的值,图形框用于绘图。根据区间[a,b]的值设置图形框的左上角坐标为(a-1,b´b+1),右下角坐标为(b+1,-1)。将区间[a,b]等分为n份,在每一等分点i上,用Line方法连线到(i,i*i)。10.5.2简单动画设计动画:有计划地移动一个对象包括改变对象的形状和尺寸。编程时可以采用帧动画原理,即通过一系列静态图辅之以连续快速变化产生动画效果,也可以通过Move方法改变图形对象的Top及Left属性来移动图形。动画的速度使用时钟控制。例10.14通过改变图形形状演示一个陀螺在图形框内转动。例10.15演示地球图标的转动,在转动时同时使地球图标在窗体内移动,并变化地球图标的尺寸。(用PictureClip控件来存放一组图片)10.5.3图形漫游滚动图形通过滚动条的滑块移动,只要设置图形框的Left或Top为滑块当前值的负数,就可形成图形相对移动。例10.16本例在窗体内显示一幅地图,移动滚动条漫游地图10.5.4图形处理技术1.操作象素通过PaintPicture方法访问内置在操作系统中的BitBlt服务程序。dpic.PaintPicturespic,dx,dy,dw,dh,sx,sy,sw,sh,rop其中:参数dpic为目标图形对象,spic为传送源,dx,dy是传送目标矩形区域左上角坐标(目标控件内任一位置)。dw,dh是目标形矩形区域的宽和高。sx,sy是要传送图形矩形区域左上角坐标。sw,sh是要传送图形矩形区域的大小。rop指定传送的象素与目标中现有的象素组合模式(如表所示)。复制图形:设置目标区域左上角坐标和大小与源矩形区域相同。翻转图形:只需改变坐标系,设置图形宽为负数,则水平翻转图形;图形高度为负数,则上下翻转图形;如果宽度和高度都为负数,则两个方向翻转图形。放大图形:改变目标图形的宽度和高度。旋转图形:要需要对原始图片按行和列的顺序或按列和行的顺序扫描象素点,然后在目标图形区颠倒行和列的顺序复制象素点。例10.17PaintPicture方法翻转放大位图。常量数值说明vbDstInvert&H00055009逆转目标位图vbNotSrcCopy&H00330008复制源位图的逆到目标位图vbSrcCopy&H00cc0020复制源位图的到目标位图vbSrcInvert&H00660046用XOR组合源位图与目标位图例10.17a本例使用PaintPicture方法实现百叶窗效果。2.使用DrawMode属性绘制图形DrawMode属性可以将新象素与原有象素用不同的方法组合。两次Xor运算恢复原有象素。例10.18用鼠标选定图形中的区域复制到指定的图片框。例10.18a在Xor运算符下图形叠加的效果。10.5.5改变窗体对象外观通过调用Windows的API函数可改变窗体的外观形状。VB应用程序要访问API函数,必须在VB应用程序中用Declare语句将API函数声明为外部过程。将API函数声明为外部过程,操作流程如下:·通过“工程/添加模块”在当前工程内加入一个BAS模块文件。·执行VB程序组中的API文本浏览器,启动API函数查看工具。·单击“文件|加载文本文件”命令,装入Win32api.Txt文件。·添加指定的API函数到选定项框中,并将函数声明复制到剪贴板。·将剪贴板中的内容粘贴到BAS模块文件中。例10.19建立一个椭圆形状的窗体。API函数CreateEllipticRgn建立椭圆外形区域,SetWindowRgn显示该区域。CreateEllipticRgn函数参数说明:坐标参数采用象数值。实际显示的窗体区域由窗体的Height、Width属性确定。需要使用ScaleX和ScaleY方法对窗体的度量单位进行转换。SetWindowRgn函数参数说明:Declare语句将API函数声明为外部过程VisualBasic应用程序访问返回hWnd窗口句柄,hRgn为窗口形状,bRedraw图形重绘控制,为一逻辑值。句柄(Handle)可看作一个对象的指针,通过它可访问该对象。可通过API函数或对象的属性返回句柄。使用API的区域设置函数不仅可以改变窗体外观,也可以改变控件外观。10.5.6在程序中加入后台音乐API函数sndPlaySound可以直接播放音频文件或系统声音。sndPlaySound函数有两个参数,lpszSoundName指定播放的音频文件或系统声音,uFlags设定播放状态。例10.20本例示范用sndPlaySound函数播放音频文件。调用形式:k=sndPlaySound(音频文件名,播放方式)播放文件为空,就可停止音乐播放注:本例要求有多媒体设备uFlags设置uFlags设置说明SND_SYNC&H00同步播放SND_ASYNC&H01非同步播放SND_NODEFAULT&H02找不到指定的语音文件时也不播放预设的声音SND_LOOP&H08重复播放SND_NOSTOP&H10不要停止其他正在播放的语音