资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,*,化学工业出版社,第,10,章 图形图像与多媒体,目录,.1 图形图像程序设计,10.1.1 Shape组件,10.1.2 Image组件,10.1.3 画布对象Canvas,10.2 多媒体程序设计,10.2.1 Animate组件,10.2.2 MediaPlayer组件,10.3 小结,10.4 习题,图形图像与多媒体技术可以为应用程序增色不少,在Delphi应用程序中使用图形图像与多媒体技术有多种方法:可以在设计阶段通过图形图像组件插入已经绘制好的图片,也可以在运行阶段动态的绘制它们;同样可以利用Delphi的多媒体组件播放音频或视频剪辑。本章将介绍Delphi标准组件库中图形图像组件(对象)和多媒体组件的用法。,10.1,图形图像程序设计,Delphi标准组件库中的图形图像组件(对象)主要有以下四个:TShape,TImage,TCanvas,TPainBox。其中TCanvas并不是可视的组件,而是专门用来进行图形图像处理的画布对象。下面分别介绍它们的功能与用法。,10.1.1 Shape,组件,TShape组件是组件面板Additional选项页上的第七个组件,可以用它来在窗体上显示一个简单的几何形状,比如矩形、圆形等。,1TShape组件的重要属性,1)shape属性:该属性是枚举类型,可用来在设计期或运行期指定Shape组件显示的几何形状,其可能的取值及意义见表10-1:,表,10-1 Shape,属性可能取值及意义列表,2)brush属性:它是TBrush类型的对象,包含两个子属性:color和style。其中color属性为Tcolor类型,用来指定几何图形的填充色。Style为TBrushStyle类型,则用来指定填充的底纹图形。它是一个枚举类型,可能的取值及其意义见图10-1:,图,10-1 Style,属性可能取值及样式,3)pen,属性:它是,TPen,类型的对象,用来定义绘制要显示的几何图形的轮廓线的样式,如线条的颜色、宽度、虚实和模式等。它包含有几个子属性,下面分别介绍。,Color,:指定绘制几何图形轮廓线的颜色,,TColor,类型。注意它和,Brush,属性中的,color,属性的区别。,Width,:指定所绘制线条的粗细,单位是像素。它是,Integer,类型,但如果给定的值小于,0,时,会被忽略。另外,它的取值将影响,style,的有效取值。,Style,:确定所显示几何图形轮廓线的虚实、是否显示等样式。它是,TPenStyle,类型的枚举类型,可能的取值及意义如表,10-2,:,表,10-2,画笔对象的样式属性可能取值及意义,需要说明的是,只有当width属性的取值等于1时,style属性取psDash、psDot、psDashDot、psDashDotDot值才会有效。,Mode:指定画笔颜色和画布颜色的相互作用效果,对线段重新赋值,但是不会改变当前的Color值。它是TPenMode类型的枚举类型,可选的取值及其意义见表10-3:,表,10-3,画笔对象模式属性取值及意义,2TShape组件应用举例,例10-1:,新建一Vcl Forms Application-Delphi,for Win32工程,,窗体设计如图,10-2:,图10-2 Tshape组件应用示例程序界面,其中三个下拉列表框中分表列出相应的属性可选的值,以备用户选择。,主要的代码:,改变绘制的几何形状:(以“圆”为例),procedure TForm1.BitBtn1Click(Sender:TObject);,begin,shape1.Shape:=stcircle;,end;,其余按钮事件代码与此类似,只是,Shape,属性取值改为相应形状值即可。,选择画刷颜色的代码:(画笔颜色的选取代码与此类似),procedure TForm1.Button1Click(Sender:TObject);,begin,if colordialog1.Execute then,shape1.Brush.Color:=colordialog1.Color;,end;,画刷样式的选择代码:(其余,2,个与此类似),procedure TForm1.ComboBox1Change(Sender:TObject);,begin,case combobox1.ItemIndex of,0:shape1.Brush.Style:=bssolid;,1:shape1.Brush.Style:=bsclear;,2:shape1.Brush.Style:=bsbdiagonal;,3:shape1.Brush.Style:=bsfdiagonal;,4:shape1.Brush.Style:=bscross;,5:shape1.Brush.Style:=bsdiagcross;,6:shape1.Brush.Style:=bshorizontal;,7:shape1.Brush.Style:=bsvertical;,end;,end;,设置画笔粗细的代码:,procedure TForm1.Edit1KeyPress(Sender:TObject;var Key:Char);,begin,if(key=#13)then,if (edit1.Text)and(edit1.text-)then,begin,shape1.Pen.Width:=strtoint(edit1.Text);,exit;,end,else exit,else;,if(key=-)and(edit1.Text=)then exit;,if not(key in 0.9)then,begin,key:=#0;,exit;,end;,if(key=0)and(edit1.Text=0)then key:=#0;,end;,10.1.2 Image,组件,Image,是一个容器组件,可以用来在窗体上指定的矩形区域内显示和输出一幅图片。具体的做法是通过其,Picture,属性中引用的,Picture,对象,封装了图片装入、清除等功能。并且该组件还引入几个属性专门用来控制图片显示的边界问题,功能强大,使用简便。下面介绍几个重要属性及方法。,1,Image,组件的重要属性。,1)Picture,属性:该属性为一个,TPicture,类的对象引用,用来装入并显示,Image,组件显示的图片。可以使用其,graphic,、,bitmap,、,icon,、,metafile,属性指定要显示的图形、位图、图标、,windows,图元等格式的图片,也可以使用,loadfromfile,(,LoadFromClipboardFormat,)方,法从指定文件(剪贴板)中装载图片。,例如:Image1.picture.loadfromfile(d:mybmp.bmp);,2)Autosize属性:该属性为Boolean类型,指定当所显示图片大小与组件大小不相适应时,TImage组件大小是否自动变化以适应图片的大小。默认值为False。,3)Proportional属性:该属性为Boolean类型,用来指定当图片大小大于组件大小时,是否按比例缩小图片以实现不失真的完整显示图片。如果图片尺寸较小时则正常显示。默认值为False。,4)Stretch,属性:该属性为,Boolean,类型,用来确定是否改变所装载图片来适应,TImage,组件的大小和形状。值为,rue,时,当,TImage,组件的大小和形状改变时,图片的大小和形状也会相应变化。由于不是简单的按比例缩放,所以当,Image,组件的形状不同与图片形状时,,Stretch,操作将会使图片扭曲失真。该属性默认值为,False,。,5)Center,属性:该属性是,Boolean,类型,用来确定当所装载图片大小和组件大小不相适应时,图片显示的位置。该值为,True,时,图片显示在组件的正中央;该值为,False,时,,图片的左上角从组件的左上角开始显示。只有在,AutoSize,属性和,Stretch,属性均为,False,时,该属性才有效。认值为,False,。,6)Transparent,属性:该属性是,Boolean,类型,用来确定所显示的图片对于后面层的组件是否透明。当值为,True,时,图片背后的组件依然可见,否则会被图片遮挡而不可见。但如果组件没有装载图片,则该属性值没有效果。该属性只对位图类型图片有效。默认值为,False,。,7)Canvas,对象:该对象提供,TImage,组件可供作图的“画布”,可以通过其属性、方法等实现图形绘制、图像处理等。详见,10.1.3,画布对象,Canvas,TImage,组件的应用示例见例,10-4,。,10.1.3,画布对象,Canvas,Delphi,应用程序处理图形图像除了可以使用以上的组件外,还提供了一个功能十分强大的,TCanvas,类。该类封装了大多数在窗体或面板之类容器上绘图所需的,Windows API,函数,用户在使用时只需要设置一些属性、调用相应的成员方法就可以实现绘图功能,而不需要只接面对,Windows,的设备场景(,DC,),也不需要申请和维护句柄资源。,系统定义了一个,TCanvas,类的对象,称为画布对象(,Canvas,)。它通常作为其它组件的一个属性,不单独使用。每个由,TControl,类派生出来的类都有该属性,相当于把这些类组件的客户区看成是一张空白的画布,充许用户在其上绘制任意图形或输出文字。下面介绍该对象的具体用法。,1,Canvas,的重要属性,画布对象的主要属性有,Pen,、,Brush,、,Pixels,、,PenPos,、,Font,等,用来定义绘制图形的风格。其中,Pen,和,Brush,的功能与用法与,TShape,中类似,这里不再赘述。,1)Pixels,属性:该属性用来存取,Canvas,中每个像素点的颜色值,其定义如下:,property PixelsX,Y:Integer:TColor;,其中,X,、,Y,表示某像素点在画布上的坐标位置,以像素为单位;属性值表示该像素点的颜色值,为,TColor,类型。实际上,一个绘图过程就是将画布指定区域的所有像素指定为特定值的过程,最后形成视觉上的图形。下面程序段完成在窗体客户区中央画一条红色水平线的功能:,For i:=0 to self.width do,Self.canvas.pixels i,self.height div 2:=clred;,同理,通过读取该属性,即可获取某像素点的当前颜色值。,注意:不是所有的设备场景(Device Context)都支持像素操作,如果设置场景不支持像素操作,或所读取像素坐标在指定的画布区域之外,则返回值为-1,而此时的写像素操作不做任何事情。,2)PenPos属性:该属性表示画笔在画布上的当前位置,类型为TPoint。通过读取该属性,可以知道当前画笔所在位置,而设置该属性,则可以移动画笔到指定位置。下面代码将移动画笔位置到坐标(100,100)处:,Self.canvas.penpos:=point(100,100);,3)Font属性:该属性为TFont类型,用来定义在画布上输出文字的属性。下面代码在窗体上以宋体14号绿色字体输出“Hello World!”:,self.canvas.Font.Color:=clgreen;,self.Canvas.Font.Name:=,宋体,;,self.Canvas.Font.Size:=12;,self.Canvas.TextOut(200,200,Hello,world!);,2.,常用绘图方法,在绘图过程中,将画布看成是多行和多列像素点构成的矩阵,每个像素点用一个平面直角坐标系的坐标来描述。该坐标系是以画布客户区的左上角作为坐标原点,以小平向右方向作为,X,轴正方向,垂直向下方向作为,Y,轴正方向建立的。画布对象封装了很多图形图像处理的方法,这里介绍其中比较常用的部分方法。,1)MoveTo,:,过程定义:,procedure MoveTo(X,Y:Integer);,其功能是将画笔的当前位置移动到点(,X,、,Y,)处。调用该方法与修改,PenPos,属性等效。查看,Delphi,的源代码可以发现,,PenPos,的写方法,SetPenPos,就是通过调用,MoveTo,方法实现的,源码如下:,/,摘自,Delphi,源码,Graphics.pas,单元,procedure TCanvas.SetPenPos(Value:TPoint);,begin,MoveTo(Value.X,Value.Y);,end;,注意:在绘图过程中,某个绘图动作之前,必须先要确定画笔的当前位置。如果下一图形的起始不是接着上一图形的终止位置,则必须要移动画笔。所以整个绘图过程可能要多次用到移动画笔的操作。,2)LineTo,:,过程定义:,procedure LineTo(X,Y:Integer);,其功能是在画布上从当前画笔位置处始,至像素点(,X,、,Y,)处画一直线,并将画笔位置移至像素点(,X,、,Y,)处。下面代码同样可完成在窗体客户区中央画一红色水平线:,Self.canvas.pen.color:=clred;,Self.canvas.moteto(0,self.height div 2);,Self.canvas.lineto(self.width,self.height div 2);,3)Rectangle,:,过程定义如下:,procedure Rectangle(X1,Y1,X2,Y2:Integer);overload;,procedure Rectangle(const Rect:TRect);overload;,其功能为在画布上用当前画笔绘制矩形区域,并用当前画刷进行填充。根据指定矩形区域的方法不同,该方法有两种重载形式。第一种形式用给出矩形区域左上角坐标(,X1,、,Y1,)和右下角坐标(,X2,、,Y2,)的方法指定矩形区域,第二种形式用一个,TRect,类型数据给定矩形区域。,下面代码完成在定时器控制下每隔指定时间在窗体上画随机矩形的功能:,procedure TForm1.Timer1Timer(Sender:TObject);,begin,X:=Random(Screen.Width-10);,Y:=Random(Screen.Height-10);,Canvas.Pen.Color:=Random(65535);,case Random(5)of,0:Canvas.Pen.Style:=psSolid;,1:Canvas.Pen.Style:=psDash;,2:Canvas.Pen.Style:=psDot;,3:Canvas.Pen.Style:=psDashDot;,4:Canvas.Pen.Style:=psDashDotDot;,end;,Canvas.Rectangle(X,Y,X+Random(400),Y+Random(400);,end;,说明:与Rectangle类似的方法还有FillRect和FrameRect。FillRect的功能是用当前画刷填充指定的矩形区域,但并不用当前画笔画出边线;FrameRect的功能则是用当前画刷颜色画出指定矩形区域的边线却并不填充。,4)Ellipse:,过程定义如下:procedure Ellipse(X1,Y1,X2,Y2:Integer);overload;,procedure Ellipse(const Rect:TRect);overload;,其功能是在画布上用当前画笔画指定矩形区域的内切椭圆,并用当前画刷填充。该函数同,Rectangle,方法一样,由给定矩形区域的不同有两种重载形式。,例如:,self.Canvas.Ellipse(100,100,200,200);,也可写为:,self.Canvas.Ellipse(Rect(100,100,200,200);,5)RoundRect,:,过程定义:,procedure RoundRect(X1,Y1,X2,Y2,X3,Y3:Integer);,其功能是在由(,X1,、,Y1,)和(,X2,、,Y2,)两点确定的矩形区域内,用当前画笔画一圆角矩形,并用当前画刷填充整个区域。每个角的弧线曲率区配由参数,X3,指定宽度、,Y3,指定高度的椭圆。,例如:,self.Canvas.RoundRect(300,300,500,500,50,50);,6)PolyGon,:,过程定义:,procedure Polygon(Points:array of TPoint);,其功能为依次用当前画笔色画直线连接参数所列像素点,并把最后一个像素点和第一个像素点连接,构成一个封闭的多边形区域,并用当前画刷颜色填充该区域。注意,该方法的参数是一个,TPoint,类型的数组,每个元素表示多边形一个顶点坐标。,示例:,self.Canvas.Polygon(point(300,300),point(400,300),point(400,400),point(300,400);,思考:你能用另一种方法完成上例的绘图功能吗?,7,),PolyLine,:,过程定义:,procedure Polyline(Points:array of TPoint);,其功能是用当前画笔依次画直线连接参数所列各像素点。与,PolyGon,不同的是该方法并不连接终止点与起始点,因而不会形成封闭的区域。另外,该方法不改变,PenPos,的值。,分析下面两条语句:,LineTo(200,200);,其功能为从当前画笔位置处画线至点,(200,200),,最后画笔位置在点,(200,200),处;,PolyLine(self.Canvas.PenPos,Point(200,200);,其功能为从当前画笔位置处画线至点,(200,200),最后画笔位置并不改变。,思考:用,PolyLine,方法可以画多边形吗?如果可以,该如何做?,8)Arc,:,过程定义:,procedure Arc(X1,Y1,X2,Y2,X3,Y3,X4,Y4:Integer);,其功能是用当前画笔画椭圆上的一段弧。该椭圆为点(,X1,、,Y1,)和点(,X2,、,Y2,)所确定矩形的内切椭圆。这段弧由起点开始,按逆时针方向画到终点。弧的起点为椭圆圆周,和点(,X3,、,Y3,)与椭圆中心点连线的交点,弧的终点为椭圆圆周和点(,X4,、,Y4,)与椭圆中心点连线的交点。,例如:,self.Canvas.Arc(200,200,400,500,600,100,100,100);,9)Chord,:,过程定义:,procedure Chord(X1,Y1,X2,Y2,X3,Y3,X4,Y4:Integer);,其功能为用当前画笔画一个由一段弧及连接弧起点和终点的弦构成的弓形,并用当前画刷填充该区域。该弧为点(,X1,、,Y1,)和点(,X2,、,Y2,)所确定矩形的内切椭圆上的一段。,该函数从点(X3、Y3)开始,逆时什方向沿椭圆圆周画弧至(X4,Y4)点,然后再直接画直线回到点(X3、Y3)。,例如:self.Canvas.Chord(200,200,400,500,100,100,600,100);,10)TextOut:,过程定义:procedure TextOut(X,Y:Integer;const Text:string);,其功能为在当前画布的指定位置处以当前字体属性输出指定的字符串。当字符串输出完毕后,画笔停留在该字符串的右上方。如下例:,self.canvas.Font.Color:=clgreen;,self.Canvas.Font.Name:=宋体;,self.Canvas.Font.Size:=12;,self.Canvas.TextOut(200,200,Hello,world!);,11)BrushCopy:,过程定义如下:,procedure BrushCopy(const Dest:TRect;Bitmap:TBitmap;,const Source:TRect;Color:TColor);,其功能为拷贝位图Bitmap中Source区域的图像至当前画布的Dest区域,Color参数则指定位图中将被画布的画刷颜色替抽换的颜色值。该方法可以实现一些图像的特效显示,比如部分透明。如下例:,var,Bitmap:TBitmap;,MyRect,MyOther:TRect;,begin,MyRect:=Rect(10,10,100,100);,MyOther:=Rect(10,111,100,201);,Bitmap:=TBitmap.Create;,Bitmap.LoadFromFile(c:windowstartan.bmp);,Form1.Canvas.BrushCopy(MyRect,Bitmap,MyRect,clBlack);,Form1.Canvas.CopyRect(MyOther,Bitmap.Canvas,MyRect);,Bitmap.Free;,end;,12)CopyRect,:,过程定义:,procedure CopyRect(const Dest:TRect;Canvas:TCanvas;,const Source:TRect);,其功能是按当前的拷贝模式设置从另外一个画布对象中拷贝部分图像到当前画布。其中参数,Canvas,指定源画布,参数,Source,指定源画布中待拷贝的区域,参数,Dest,指定当前画布接收图像的区域。如果,Dest,区域的大小与,Source,区域的大小不一致,则相当于完成对拷贝部分的图像进行放缩操作。,利用,CopyRect,方法可以实现多种图像显示的特殊效果,在本节的示例,10-4,中会演示其用法。,13)Draw:,过程定义:procedure Draw(X,Y:Integer;Graphic:TGraphic);,其功能是将参数Graphic指定的图像画在当前画布上,图像的左上角定位在点(X,Y)处。,图像可以是位图、图标或图元格式。如果是位图格式,则遵照CopyMode属性设置的模式绘制图像。如下例:,var,Bitmap:TBitMap;,begin,Bitmap:=TBitmap.Create;,try,with Bitmap do,begin,LoadFromFile(d:factory.bmp);,Transparent:=True;,TransParentColor:=BitMap.canvas.pixels50,50;,Form1.Canvas.Draw(0,0,BitMap);,TransparentMode:=tmAuto;,Form1.Canvas.Draw(50,50,BitMap);,end;,finally,Bitmap.Free;,end;,end;,3.画布对象应用举例,例10-2简单的鼠标画图程序,本例制作一个用鼠标画简单图形的程序,其关键部分是鼠标事件的响应。窗体制作如图10-3:,图,10-3,画图程序界面,图10-3 画图程序界面,主要代码如下:,图形选择菜单项单击事件:,procedure TForm1.N9Click(Sender:TObject);,begin,gra:=0;/gra全部变量,表示用户选择的图形类型。,end;,按下鼠标后,虚线绘制图形轮廓代码:,procedure TForm1.FormMouseDown(Sender:TObject;Button:,TMouseButton;Shift:TShiftState;X,Y:Integer);,begin,if button=mbleft then,begin,drag:=true;,xx:=x;,yy:=y;,x1:=x;,y1:=y;,canvas.MoveTo(x,y);,end;,end;,procedure TForm1.FormMouseMove(Sender:TObject;,Shift:TShiftState;X,Y:Integer);,begin,case gra of,0,1:if drag then,begin,if(x1xx)and(y1yy)then,begin,canvas.pen.Color:=form1.Color;,canvas.Pen.Width:=4;,canvas.MoveTo(xx,yy);,canvas.Pen.Style:=pssolid;,canvas.LineTo(x1,y1);,end;,canvas.Pen.Style:=psdot;,canvas.Pen.Color:=colordialog1.Color;,canvas.Pen.Width:=0;,canvas.MoveTo(xx,yy);,canvas.LineTo(x,y);,x1:=x;,y1:=y;,end;,2:if drag then,begin,if(x1xx)and(y1yy)then,begin,canvas.pen.Color:=form1.Color;,canvas.Pen.Width:=4;,canvas.MoveTo(xx,yy);,canvas.Pen.Style:=pssolid;,canvas.Rectangle(xx,yy,x1,y1);,end;,canvas.Pen.Style:=psdot;,canvas.Pen.Color:=colordialog1.Color;,canvas.Pen.Width:=0;,canvas.MoveTo(xx,yy);,canvas.Rectangle(xx,yy,x,y);,x1:=x;,y1:=y;,end;,3:/,此部分代码省略,有兴趣读者可以自已补充;,11:,else,if drag then canvas.LineTo(x,y);,end;,end;,松开鼠标后,实际画图操作:,procedure TForm1.FormMouseUp(Sender:TObject;Button:,TMouseButton;Shift:TShiftState;X,Y:Integer);,begin,drag:=false;,case gra of,0:begin,canvas.MoveTo(xx,yy);,canvas.Pen.Style:=pssolid;,canvas.LineTo(x,y);,end;,1:begin,canvas.MoveTo(xx,yy);,canvas.Pen.Style:=psdot;,canvas.LineTo(x,y);,end;,2:begin,canvas.MoveTo(xx,yy);,canvas.Pen.Color:=form1.Color;,canvas.Rectangle(xx,yy,x1,y1);,canvas.MoveTo(xx,yy);,canvas.Pen.Style:=pssolid;,canvas.Pen.Color:=pencolor;,canvas.Arc(xx,yy,x1,y1,xx,yy,x1,y1);,end;,/,情况,311,代码省图,有兴趣的读者请自己补充完整,end;,tempg.Width:=form1.ClientWidth;,tempg.Height:=form1.ClientHeight;,Tempg.Canvas.CopyRect(rect(0,0,tempg.Width,tempg.Height),form1.Canvas,rect(0,0,tempg.Width,tempg.Height);,end;,“保存”已绘图形代码:,procedure TForm1.N25Click(Sender:TObject);,begin,tempg.Width:=form1.ClientWidth;,tempg.Height:=form1.ClientHeight;,tempg.Canvas.CopyRect(rect(0,0,tempg.Width,tempg.Height),form1.Canvas,rect(0,0,tempg.Width,tempg.Height);,if savedialog1.Execute then,tempg.SaveToFile(savedialog1.FileName);,end;,代码中的tempg为一个全局tbitmap对象,在窗体创建时被程序创建,用来临时保存已绘的图像,以保证当窗体重绘时,图像不会丢失,如下代码:,procedure TForm1.FormPaint(Sender:TObject);,begin,form1.Canvas.copyrect(rect(0,0,tempg.Width,tempg.Height),tempg.Canvas,rect(0,0,tempg.Width,tempg.Height);,end;,利用窗体的画布对象,合理的设计与编写窗体鼠标事件的处理过程,即可实现简单的画笔程序,有兴趣的读者不妨自己去尝试把本例进一步扩充和完善。,例10-3绘制正弦曲线,本例演示如何绘制一个正弦函数图像,其关健是图像所含像素点坐标的计算和两个坐标系下坐标的变换。运行结果如图10-4:,图,10-4,绘制正弦曲线程序运行结果,绘制代码如下:,procedure TForm1.BitBtn1Click(Sender:TObject);,var x,y,i:integer;,py:real;,begin,canvas.MoveTo(0,form1.ClientHeight div 2);,canvas.LineTo(form1.ClientWidth,form1.ClientHeight div 2);,canvas.MoveTo(form1.ClientWidth div 2,0);,canvas.LineTo(form1.ClientWidth div 2,form1.ClientHeight);,for i:=-(form1.clientwidth div 2)to (form1.ClientWidth div 2)do,begin,py:=34*sin(i mod 240)*(2*pi)/240);,y:=form1.ClientHeight div 2-trnc(py);,x:=form1.clientwidth div 2+i;,canvas.Pixelsx,y:=clred;,end;,end;,实际上,利用对像素点的直接访问,可以实现很多图像处理的特殊效果,比如彩色图像的灰度显示、浮雕化效果等,有兴趣的读者可以自己去尝试。,例,10-4,图像翻转程序,本例演示一个将图片按要求翻转的程序,主要原理是利用,CopyRect,方法,把源区域和目标区域的对应方向作相应变化即可实现。运行效果如图,10-5,:,图,10-5,图像翻转程序运行结果,主要代码如下:,procedure TForm1.BitBtn1Click(Sender:TObject);/打开图片,begin,if openpicturedialog1.Execute then,image1.Picture.LoadFromFile(openpicturedialog1.FileName);,end;,procedure TForm1.BitBtn2Click(Sender:TObject);/,水平翻转,begin,tembmp.Canvas.CopyMode:=cmsrccopy;,tembmp.Canvas.CopyRect(rect(tembmp.Width,0,0,tembmp.Height),image1.Canvas,rect(0,0,image1.Width,image1.Height);,image2.Left:=image1.Width+10;,image2.Picture.Bitmap:=tembmp;,end;,procedure TForm1.BitBtn3Click(Sender:TObject);/,垂直翻转,begin,tembmp.Canvas.CopyMode:=cmsrccopy;,tembmp.Canvas.CopyRect(rect(0,tembmp.Height,tembmp.Width,0),image1.Canvas,rect(0,0,image1.Width,image1.Height);,image3.Left:=image1.left;,image3.Top:=image1.Height+image1.top+10;,image3.Picture.Bitmap:=tembmp;,end;,procedure TForm1.BitBtn4Click(Sender:TObject);/,对角翻转,begin,tembmp.Canvas.CopyMode:=cmsrccopy;,tembmp.Canvas.CopyRect(rect(tembmp.Width,tembmp.Height,0,0),image1.Canvas,rect(0,0,image1.Width,image1.Height);,image4.Left:=image1.Width+10;,image4.Top:=image1.Height+image1.top+10;,image4.Picture.Bitmap:=tembmp;,end;,实际上,灵活使用CopyRect方法,可以实现很多种图像显示的特殊效果,比如拉幕式、百叶窗式、渐隐渐显式等不同的图像显示方式。具体实现方法请读者自已去思考、尝试。,10.1.4 Paintbox,组件,在程序中,除了可以利用窗体的Canvas对象直接在窗体上绘图外,还可以利用PaintBox组件来作图。该组件在System选项卡上,用它绘图的方法与在窗体上直接绘图类似,不同的是,这时的坐标是以TPainBox组件的Canvas左上角作为坐标原点的,因此不需要考虑其在窗体中的位置。另外,可以在设计期定义该组件的大小和位置,当所绘制图形大与该组件的画布区域时,超出部分将自动切割。,与,Image,组件不同的是,该组件内绘制的图形如果希望在窗体及组件重绘后保持,则必须在其,OnPaint,事件的处理代码中重绘这部分图形。如下例:,新建一,Vcl Forms Application-Delphi for Win32,工程,在窗体上加入一个,Button,组件,一个,PainBox,组件,然后编写下面两个事件处理代码:,procedure Form1.Button1Click(Sender:TObject);,begin,PaintBox1.Canvas.Brush.Color:=clRed;,PaintBox1.Canvas.FillRect(PaintBox1.Canvas.ClipRect);,PaintBox1.Canvas.Ellipse(0,0,100,100);,end;,procedure Form1.PaintBox1Paint(Sender:TObject);,begin,PaintBox1.Canvas.Ellipse(0,0,100,100);,end;,编译运行该程序,可以看到窗体上出现一个椭圆,单击Button后出现一个红色矩形区域。但当把窗体最小化再还原后,观察图形发现椭圆还在,但红色矩形区域却消失了。,10.2,多媒体程序设计,除了强大的图形图像处理能力,Delphi应用程序同样支持音、视频的处理。在Win32选项卡上的Animate组件可以用来播放无声的AVI视频片断,而MediaPlayer组件则可以提供对常见音、视频格式的处理功能,例如WAV、CD、MIDI、MP3等。,10.2.1 Animate,组件,Anima
展开阅读全文