《第10章-图形图像与多媒体ppt课件(全).ppt》由会员分享,可在线阅读,更多相关《第10章-图形图像与多媒体ppt课件(全).ppt(115页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第10章章 图形图像与多媒体图形图像与多媒体目录.1 图形图像程序设计图形图像程序设计10.1.1 Shape组件组件10.1.2 Image组件组件10.1.3 画布对象画布对象Canvas10.2 多媒体程序设计多媒体程序设计10.2.1 Animate组件组件10.2.2 MediaPlayer组件组件10.3 小结小结10.4 习题习题 图形图像与多媒体技术可以为应用程序增色不少,在Delphi应用程序中使用图形图像与多媒体技术有多种方法:可以在设计阶段通过图形图像组件插入已经绘制好的图片,也可以在运行阶段动态的绘制它们;同样可以利用Delphi的多媒体组件播放音频或视频剪辑。本章将
2、介绍Delphi标准组件库中图形图像组件(对象)和多媒体组件的用法。10.1 图形图像程序设计Delphi标准组件库中的图形图像组件(对象)主要有以下四个:TShape,TImage,TCanvas,TPainBox。其中TCanvas并不是可视的组件,而是专门用来进行图形图像处理的画布对象。下面分别介绍它们的功能与用法。10.1.1 Shape组件TShape组件是组件面板Additional选项页上的第七个组件,可以用它来在窗体上显示一个简单的几何形状,比如矩形、圆形等。1TShape组件的重要属性1)shape属性:该属性是枚举类型,可用来在设计期或运行期指定Shape组件显示的几何形状
3、,其可能的取值及意义见表10-1:表10-1 Shape属性可能取值及意义列表2)brush属性:它是TBrush类型的对象,包含两个子属性:color和style。其中color属性为Tcolor类型,用来指定几何图形的填充色。Style为TBrushStyle类型,则用来指定填充的底纹图形。它是一个枚举类型,可能的取值及其意义见图10-1:图10-1 Style属性可能取值及样式3)pen属性:它是TPen类型的对象,用来定义绘制要显示的几何图形的轮廓线的样式,如线条的颜色、宽度、虚实和模式等。它包含有几个子属性,下面分别介绍。Color:指定绘制几何图形轮廓线的颜色,TColor类型。注
4、意它和Brush属性中的color属性的区别。Width:指定所绘制线条的粗细,单位是像素。它是Integer类型,但如果给定的值小于0时,会被忽略。另外,它的取值将影响style的有效取值。Style:确定所显示几何图形轮廓线的虚实、是否显示等样式。它是TPenStyle类型的枚举类型,可能的取值及意义如表10-2:表10-2 画笔对象的样式属性可能取值及意义需要说明的是,只有当width属性的取值等于1时,style属性取psDash、psDot、psDashDot、psDashDotDot值才会有效。Mode:指定画笔颜色和画布颜色的相互作用效果,对线段重新赋值,但是不会改变当前的Col
5、or值。它是TPenMode类型的枚举类型,可选的取值及其意义见表10-3:表10-3 画笔对象模式属性取值及意义2TShape组件应用举例例10-1:新建一Vcl Forms Application-Delphifor Win32工程,窗体设计如图10-2:图10-2 Tshape组件应用示例程序界面其中三个下拉列表框中分表列出相应的属性可选的值,以备用户选择。主要的代码:改变绘制的几何形状:(以“圆”为例)procedure TForm1.BitBtn1Click(Sender:TObject);begin shape1.Shape:=stcircle;end;其余按钮事件代码与此类似,只
6、是Shape属性取值改为相应形状值即可。选择画刷颜色的代码:(画笔颜色的选取代码与此类似)procedure TForm1.Button1Click(Sender:TObject);beginif colordialog1.Execute then shape1.Brush.Color:=colordialog1.Color;end;画刷样式的选择代码:(其余2个与此类似)procedure TForm1.ComboBox1Change(Sender:TObject);begincase combobox1.ItemIndex of 0:shape1.Brush.Style:=bssolid;
7、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 Ke
8、y: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是一个容器组件,可以用来在窗体上指定的矩形区
9、域内显示和输出一幅图片。具体的做法是通过其Picture属性中引用的Picture对象,封装了图片装入、清除等功能。并且该组件还引入几个属性专门用来控制图片显示的边界问题,功能强大,使用简便。下面介绍几个重要属性及方法。1Image组件的重要属性。1)Picture属性:该属性为一个TPicture类的对象引用,用来装入并显示Image组件显示的图片。可以使用其graphic、bitmap、icon、metafile属性指定要显示的图形、位图、图标、windows图元等格式的图片,也可以使用loadfromfile(LoadFromClipboardFormat)方法从指定文件(剪贴板)中装载
10、图片。例如:Image1.picture.loadfromfile(d:mybmp.bmp);2)Autosize属性:该属性为Boolean类型,指定当所显示图片大小与组件大小不相适应时,TImage组件大小是否自动变化以适应图片的大小。默认值为False。3)Proportional属性:该属性为Boolean类型,用来指定当图片大小大于组件大小时,是否按比例缩小图片以实现不失真的完整显示图片。如果图片尺寸较小时则正常显示。默认值为False。4)Stretch属性:该属性为Boolean类型,用来确定是否改变所装载图片来适应TImage组件的大小和形状。值为rue时,当TImage组件的
11、大小和形状改变时,图片的大小和形状也会相应变化。由于不是简单的按比例缩放,所以当Image组件的形状不同与图片形状时,Stretch操作将会使图片扭曲失真。该属性默认值为False。5)Center属性:该属性是Boolean类型,用来确定当所装载图片大小和组件大小不相适应时,图片显示的位置。该值为True时,图片显示在组件的正中央;该值为False时,图片的左上角从组件的左上角开始显示。只有在AutoSize属性和Stretch属性均为False时,该属性才有效。认值为False。6)Transparent属性:该属性是Boolean类型,用来确定所显示的图片对于后面层的组件是否透明。当值为
12、True时,图片背后的组件依然可见,否则会被图片遮挡而不可见。但如果组件没有装载图片,则该属性值没有效果。该属性只对位图类型图片有效。默认值为False。7)Canvas对象:该对象提供TImage组件可供作图的“画布”,可以通过其属性、方法等实现图形绘制、图像处理等。详见10.1.3 画布对象Canvas TImage组件的应用示例见例10-4。10.1.3 画布对象CanvasDelphi应用程序处理图形图像除了可以使用以上的组件外,还提供了一个功能十分强大的TCanvas类。该类封装了大多数在窗体或面板之类容器上绘图所需的Windows API函数,用户在使用时只需要设置一些属性、调用相
13、应的成员方法就可以实现绘图功能,而不需要只接面对Windows的设备场景(DC),也不需要申请和维护句柄资源。系统定义了一个TCanvas类的对象,称为画布对象(Canvas)。它通常作为其它组件的一个属性,不单独使用。每个由TControl类派生出来的类都有该属性,相当于把这些类组件的客户区看成是一张空白的画布,充许用户在其上绘制任意图形或输出文字。下面介绍该对象的具体用法。1Canvas的重要属性 画布对象的主要属性有Pen、Brush、Pixels、PenPos、Font等,用来定义绘制图形的风格。其中Pen和Brush的功能与用法与TShape中类似,这里不再赘述。1)Pixels属性
14、:该属性用来存取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;同理,通过读取该属性,即可获取某像素点的当前颜色值。注意:不是所有的设备场景(
15、Device Context)都支持像素操作,如果设置场景不支持像素操作,或所读取像素坐标在指定的画布区域之外,则返回值为-1,而此时的写像素操作不做任何事情。2)PenPos属性:该属性表示画笔在画布上的当前位置,类型为TPoint。通过读取该属性,可以知道当前画笔所在位置,而设置该属性,则可以移动画笔到指定位置。下面代码将移动画笔位置到坐标(100,100)处:Self.canvas.penpos:=point(100,100);3)Font属性:该属性为TFont类型,用来定义在画布上输出文字的属性。下面代码在窗体上以宋体14号绿色字体输出“Hello World!”:self.canv
16、as.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:
17、Integer);其功能是将画笔的当前位置移动到点(X、Y)处。调用该方法与修改PenPos属性等效。查看Delphi的源代码可以发现,PenPos的写方法SetPenPos就是通过调用MoveTo方法实现的,源码如下:/摘自Delphi源码Graphics.pas单元procedure TCanvas.SetPenPos(Value:TPoint);begin MoveTo(Value.X,Value.Y);end;注意:在绘图过程中,某个绘图动作之前,必须先要确定画笔的当前位置。如果下一图形的起始不是接着上一图形的终止位置,则必须要移动画笔。所以整个绘图过程可能要多次用到移动画笔的操作。2
18、)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);ove
19、rload;procedure Rectangle(const Rect:TRect);overload;其功能为在画布上用当前画笔绘制矩形区域,并用当前画刷进行填充。根据指定矩形区域的方法不同,该方法有两种重载形式。第一种形式用给出矩形区域左上角坐标(X1、Y1)和右下角坐标(X2、Y2)的方法指定矩形区域,第二种形式用一个TRect类型数据给定矩形区域。下面代码完成在定时器控制下每隔指定时间在窗体上画随机矩形的功能:procedure TForm1.Timer1Timer(Sender:TObject);begin X:=Random(Screen.Width-10);Y:=Random(
20、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和Fra
21、meRect。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
22、,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
23、 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);其功能是用当前画笔依次画直线连接
24、参数所列各像素点。与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:Int
25、eger);其功能是用当前画笔画椭圆上的一段弧。该椭圆为点(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);其功能为用当前画笔画一个由一段弧及连接弧起点和终点的弦构成的弓形,并用当前画刷填充该区域。该弧为点(
26、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
27、.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 Bitm
28、ap: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:过程定义:pr
29、ocedure CopyRect(const Dest:TRect;Canvas:TCanvas;const Source:TRect);其功能是按当前的拷贝模式设置从另外一个画布对象中拷贝部分图像到当前画布。其中参数Canvas指定源画布,参数Source指定源画布中待拷贝的区域,参数Dest指定当前画布接收图像的区域。如果Dest区域的大小与Source区域的大小不一致,则相当于完成对拷贝部分的图像进行放缩操作。利用CopyRect方法可以实现多种图像显示的特殊效果,在本节的示例10-4中会演示其用法。13)Draw:过程定义:procedure Draw(X,Y:Integer;Grap
30、hic: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
31、);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);begingra:=0;/gra全部变量,表示用户选择的图形类型。end;按下鼠标后,虚线绘制图形轮廓代码:proce
32、dure 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
33、begin if(x1xx)and(y1yy)thenbegin 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 dra
34、g 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
35、);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);begindrag:=false;case gra of 0:begin canvas.MoveTo(xx,yy);canvas.Pen.Style:=pssolid;canvas.LineTo(x,y);
36、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代码省图,有兴趣的读者
37、请自己补充完整 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.Clien
38、tHeight;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);beg
39、in 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.BitBtn1Clic
40、k(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.ClientWi
41、dth 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:图1
42、0-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.
43、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.Can
44、vas,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.Ca
45、nvas,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组件来作图。该组件在Sy
46、stem选项卡上,用它绘图的方法与在窗体上直接绘图类似,不同的是,这时的坐标是以TPainBox组件的Canvas左上角作为坐标原点的,因此不需要考虑其在窗体中的位置。另外,可以在设计期定义该组件的大小和位置,当所绘制图形大与该组件的画布区域时,超出部分将自动切割。与Image组件不同的是,该组件内绘制的图形如果希望在窗体及组件重绘后保持,则必须在其OnPaint事件的处理代码中重绘这部分图形。如下例:新建一Vcl Forms Application-Delphi for Win32工程,在窗体上加入一个Button组件,一个PainBox组件,然后编写下面两个事件处理代码:procedure
47、 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后出
48、现一个红色矩形区域。但当把窗体最小化再还原后,观察图形发现椭圆还在,但红色矩形区域却消失了。10.2 多媒体程序设计除了强大的图形图像处理能力,Delphi应用程序同样支持音、视频的处理。在Win32选项卡上的Animate组件可以用来播放无声的AVI视频片断,而MediaPlayer组件则可以提供对常见音、视频格式的处理功能,例如WAV、CD、MIDI、MP3等。10.2.1 Animate组件Animate的使用比较简单:将该组件放置在窗体的适当位置,选定要播放的动画剪辑,设定重复播放次数,然后将其Active属性改为True,动画立即开始播放,在设计期就可以看到效果。该组件播放的动话剪辑
49、有两种来源,一种是来自指定的AVI文件,另外一种是Windows的内部动画,如查找、删除文件等。具体设定方法很简单,只需要设置相应属性即可。1Animate的重要属性1)CommonAVI:用来指定播放Windows系统Shell32.dll中的哪一段内部动画剪辑。这些动画就是系统在用户做文件操作时播放的。其可能的值及说明如表10-4:表10-4 可用的预置动画列表 2)FileName:用来指定要从文件中装入的外部AVI动画的文件名。如果装载成功,则自动设置Open属性为True。如果动画中包含有声音,则被忽略。注意:该属性与CommonAVI是互斥的。如果设置FileName属性,则Com
50、monAVI属性会被自动设置为aviNone;如果设置CommonAVI属性为非aviNone值,则FileName属性会被自动设置为空。3)FrameCount:保存TAnimate组件所装载动画的总帧数。4)StartFrame和StopFrame:指定TAnimate组件将要播放动画的起始帧号和结束帧号。帧数序号从1开始。默认情况下,当一个动画被装载后,StartFrame值被设置为1,StopFrame值被设置为FrameCount值,即全部播放。可以通过修改这两个属性以实现只播放一部分帧的功能,但应满足StartFrame=FrameCount。5)Repetitions:该属性值指