版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第10章图形图像与多媒体目录.1图形图像程序设计10.1.1Shape组件10.1.2Image组件10.1.3画布对象Canvas110.2多媒体程序设计10.2.1Animate组件10.2.2MediaPlayer组件210.3小结310.4习题4图形图像与多媒体技术可以为应用程序增色不少,在Delphi应用程序中使用图形图像与多媒体技术有多种方法:可以在设计阶段通过图形图像组件插入已经绘制好的图片,也可以在运行阶段动态的绘制它们;同样可以利用Delphi的多媒体组件播放音频或视频剪辑。本章将介绍Delphi标准组件库中图形图像组件(对象)和多媒体组件的用法。10.1图形图像程序设计Delphi标准组件库中的图形图像组件(对象)主要有以下四个:TShape,TImage,TCanvas,TPainBox。其中TCanvas并不是可视的组件,而是专门用来进行图形图像处理的画布对象。下面分别介绍它们的功能与用法。10.1.1Shape组件TShape组件是组件面板Additional选项页上的第七个组件,可以用它来在窗体上显示一个简单的几何形状,比如矩形、圆形等。1.TShape组件的重要属性1)shape属性:该属性是枚举类型,可用来在设计期或运行期指定Shape组件显示的几何形状,其可能的取值及意义见表10-1:表10-1Shape属性可能取值及意义列表2)brush属性:它是TBrush类型的对象,包含两个子属性:color和style。其中color属性为Tcolor类型,用来指定几何图形的填充色。Style为TBrushStyle类型,则用来指定填充的底纹图形。它是一个枚举类型,可能的取值及其意义见图10-1:图10-1Style属性可能取值及样式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画笔对象模式属性取值及意义2.TShape组件应用举例例10-1:新建一VclFormsApplication-DelphiforWin32工程,窗体设计如图10-2:图10-2Tshape组件应用示例程序界面其中三个下拉列表框中分表列出相应的属性可选的值,以备用户选择。主要的代码:改变绘制的几何形状:(以“圆”为例)procedureTForm1.BitBtn1Click(Sender:TObject);beginshape1.Shape:=stcircle;end;其余按钮事件代码与此类似,只是Shape属性取值改为相应形状值即可。选择画刷颜色的代码:(画笔颜色的选取代码与此类似)procedureTForm1.Button1Click(Sender:TObject);beginifcolordialog1.Executethenshape1.Brush.Color:=colordialog1.Color;end;画刷样式的选择代码:(其余2个与此类似)procedureTForm1.ComboBox1Change(Sender:TObject);begincasecombobox1.ItemIndexof0: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;设置画笔粗细的代码:procedureTForm1.Edit1KeyPress(Sender:TObject;varKey:Char);beginif(key=#13)thenif(edit1.Text<>'')and(edit1.text<>'-')thenbeginshape1.Pen.Width:=strtoint(edit1.Text);exit;endelseexitelse;if(key='-')and(edit1.Text='')thenexit;ifnot(keyin['0'..'9'])thenbeginkey:=#0;exit;end;if(key='0')and(edit1.Text='0')thenkey:=#0;end;10.1.2Image组件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组件的大小和形状。值为True时,当TImage组件的大小和形状改变时,图片的大小和形状也会相应变化。由于不是简单的按比例缩放,所以当TImage组件的形状不同与图片形状时,Stretch操作将会使图片扭曲失真。该属性默认值为False。5)Center属性:该属性是Boolean类型,用来确定当所装载图片大小和组件大小不相适应时,图片显示的位置。该值为True时,图片显示在组件的正中央;该值为False时,图片的左上角从组件的左上角开始显示。只有在AutoSize属性和Stretch属性均为False时,该属性才有效。认值为False。6)Transparent属性:该属性是Boolean类型,用来确定所显示的图片对于后面层的组件是否透明。当值为True时,图片背后的组件依然可见,否则会被图片遮挡而不可见。但如果组件没有装载图片,则该属性值没有效果。该属性只对位图类型图片有效。默认值为False。7)Canvas对象:该对象提供TImage组件可供作图的“画布”,可以通过其属性、方法等实现图形绘制、图像处理等。详见10.1.3画布对象CanvasTImage组件的应用示例见例10-4。10.1.3画布对象CanvasDelphi应用程序处理图形图像除了可以使用以上的组件外,还提供了一个功能十分强大的TCanvas类。该类封装了大多数在窗体或面板之类容器上绘图所需的WindowsAPI函数,用户在使用时只需要设置一些属性、调用相应的成员方法就可以实现绘图功能,而不需要只接面对Windows的设备场景(DC),也不需要申请和维护句柄资源。系统定义了一个TCanvas类的对象,称为画布对象(Canvas)。它通常作为其它组件的一个属性,不单独使用。每个由TControl类派生出来的类都有该属性,相当于把这些类组件的客户区看成是一张空白的画布,充许用户在其上绘制任意图形或输出文字。下面介绍该对象的具体用法。1.Canvas的重要属性画布对象的主要属性有Pen、Brush、Pixels、PenPos、Font等,用来定义绘制图形的风格。其中Pen和Brush的功能与用法与TShape中类似,这里不再赘述。
1)Pixels属性:该属性用来存取Canvas中每个像素点的颜色值,其定义如下:
propertyPixels[X,Y:Integer]:TColor;
其中X、Y表示某像素点在画布上的坐标位置,以像素为单位;属性值表示该像素点的颜色值,为TColor类型。实际上,一个绘图过程就是将画布指定区域的所有像素指定为特定值的过程,最后形成视觉上的图形。下面程序段完成在窗体客户区中央画一条红色水平线的功能:Fori:=0toself.widthdoSelf.canvas.pixels[i,self.heightdiv2]:=clred;同理,通过读取该属性,即可获取某像素点的当前颜色值。注意:不是所有的设备场景(DeviceContext)都支持像素操作,如果设置场景不支持像素操作,或所读取像素坐标在指定的画布区域之外,则返回值为-1,而此时的写像素操作不做任何事情。2)PenPos属性:该属性表示画笔在画布上的当前位置,类型为TPoint。通过读取该属性,可以知道当前画笔所在位置,而设置该属性,则可以移动画笔到指定位置。下面代码将移动画笔位置到坐标(100,100)处:Self.canvas.penpos:=point(100,100);3)Font属性:该属性为TFont类型,用来定义在画布上输出文字的属性。下面代码在窗体上以宋体14号绿色字体输出“HelloWorld!”: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:过程定义:procedureMoveTo(X,Y:Integer);其功能是将画笔的当前位置移动到点(X、Y)处。调用该方法与修改PenPos属性等效。查看Delphi的源代码可以发现,PenPos的写方法SetPenPos就是通过调用MoveTo方法实现的,源码如下://摘自Delphi源码Graphics.pas单元procedureTCanvas.SetPenPos(Value:TPoint);beginMoveTo(Value.X,Value.Y);end;注意:在绘图过程中,某个绘图动作之前,必须先要确定画笔的当前位置。如果下一图形的起始不是接着上一图形的终止位置,则必须要移动画笔。所以整个绘图过程可能要多次用到移动画笔的操作。2)LineTo:过程定义:procedureLineTo(X,Y:Integer);其功能是在画布上从当前画笔位置处始,至像素点(X、Y)处画一直线,并将画笔位置移至像素点(X、Y)处。下面代码同样可完成在窗体客户区中央画一红色水平线:Self.canvas.pen.color:=clred;Self.canvas.moteto(0,self.heightdiv2);Self.canvas.lineto(self.width,self.heightdiv2);3)Rectangle:过程定义如下:procedureRectangle(X1,Y1,X2,Y2:Integer);overload;procedureRectangle(constRect:TRect);overload;
其功能为在画布上用当前画笔绘制矩形区域,并用当前画刷进行填充。根据指定矩形区域的方法不同,该方法有两种重载形式。第一种形式用给出矩形区域左上角坐标(X1、Y1)和右下角坐标(X2、Y2)的方法指定矩形区域,第二种形式用一个TRect类型数据给定矩形区域。下面代码完成在定时器控制下每隔指定时间在窗体上画随机矩形的功能:procedureTForm1.Timer1Timer(Sender:TObject);beginX:=Random(Screen.Width-10);Y:=Random(Screen.Height-10);Canvas.Pen.Color:=Random(65535);caseRandom(5)of0: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:过程定义如下:procedureEllipse(X1,Y1,X2,Y2:Integer);overload;procedureEllipse(constRect:TRect);overload;其功能是在画布上用当前画笔画指定矩形区域的内切椭圆,并用当前画刷填充。该函数同Rectangle方法一样,由给定矩形区域的不同有两种重载形式。例如:self.Canvas.Ellipse(100,100,200,200);也可写为:self.Canvas.Ellipse(Rect(100,100,200,200));5)RoundRect:过程定义:procedureRoundRect(X1,Y1,X2,Y2,X3,Y3:Integer);其功能是在由(X1、Y1)和(X2、Y2)两点确定的矩形区域内,用当前画笔画一圆角矩形,并用当前画刷填充整个区域。每个角的弧线曲率区配由参数X3指定宽度、Y3指定高度的椭圆。例如:self.Canvas.RoundRect(300,300,500,500,50,50);6)PolyGon:过程定义:procedurePolygon(Points:arrayofTPoint);其功能为依次用当前画笔色画直线连接参数所列像素点,并把最后一个像素点和第一个像素点连接,构成一个封闭的多边形区域,并用当前画刷颜色填充该区域。注意,该方法的参数是一个TPoint类型的数组,每个元素表示多边形一个顶点坐标。示例:self.Canvas.Polygon([point(300,300),point(400,300),point(400,400),point(300,400)]);思考:你能用另一种方法完成上例的绘图功能吗?7)PolyLine:过程定义:procedurePolyline(Points:arrayofTPoint);其功能是用当前画笔依次画直线连接参数所列各像素点。与PolyGon不同的是该方法并不连接终止点与起始点,因而不会形成封闭的区域。另外,该方法不改变PenPos的值。分析下面两条语句:
LineTo(200,200);其功能为从当前画笔位置处画线至点(200,200),最后画笔位置在点(200,200)处;PolyLine([self.Canvas.PenPos,Point(200,200)]);其功能为从当前画笔位置处画线至点(200,200),最后画笔位置并不改变。思考:用PolyLine方法可以画多边形吗?如果可以,该如何做?8)Arc:过程定义:procedureArc(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:过程定义:procedureChord(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:过程定义:procedureTextOut(X,Y:Integer;constText:string);其功能为在当前画布的指定位置处以当前字体属性输出指定的字符串。当字符串输出完毕后,画笔停留在该字符串的右上方。如下例:self.canvas.Font.Color:=clgreen;self.Canvas.Font.Name:='宋体';self.Canvas.Font.Size:=12;self.Canvas.TextOut(200,200,'Hello,world!');11)BrushCopy:过程定义如下:procedureBrushCopy(constDest:TRect;Bitmap:TBitmap;constSource:TRect;Color:TColor);其功能为拷贝位图Bitmap中Source区域的图像至当前画布的Dest区域,Color参数则指定位图中将被画布的画刷颜色替抽换的颜色值。该方法可以实现一些图像的特效显示,比如部分透明。如下例:varBitmap:TBitmap;MyRect,MyOther:TRect;beginMyRect:=Rect(10,10,100,100);MyOther:=Rect(10,111,100,201);Bitmap:=TBitmap.Create;Bitmap.LoadFromFile('c:\windows\tartan.bmp');Form1.Canvas.BrushCopy(MyRect,Bitmap,MyRect,clBlack);Form1.Canvas.CopyRect(MyOther,Bitmap.Canvas,MyRect);Bitmap.Free;end;12)CopyRect:过程定义:procedureCopyRect(constDest:TRect;Canvas:TCanvas;constSource:TRect);其功能是按当前的拷贝模式设置从另外一个画布对象中拷贝部分图像到当前画布。其中参数Canvas指定源画布,参数Source指定源画布中待拷贝的区域,参数Dest指定当前画布接收图像的区域。如果Dest区域的大小与Source区域的大小不一致,则相当于完成对拷贝部分的图像进行放缩操作。利用CopyRect方法可以实现多种图像显示的特殊效果,在本节的示例10-4中会演示其用法。13)Draw:过程定义:procedureDraw(X,Y:Integer;Graphic:TGraphic);其功能是将参数Graphic指定的图像画在当前画布上,图像的左上角定位在点(X,Y)处。图像可以是位图、图标或图元格式。如果是位图格式,则遵照CopyMode属性设置的模式绘制图像。如下例:varBitmap:TBitMap;beginBitmap:=TBitmap.Create;trywithBitmapdobeginLoadFromFile('d:\factory.bmp');Transparent:=True;TransParentColor:=BitMap.canvas.pixels[50,50];Form1.Canvas.Draw(0,0,BitMap);TransparentMode:=tmAuto;Form1.Canvas.Draw(50,50,BitMap);end;finallyBitmap.Free;end;end;3.画布对象应用举例例10-2.简单的鼠标画图程序本例制作一个用鼠标画简单图形的程序,其关键部分是鼠标事件的响应。窗体制作如图10-3:图10-3画图程序界面图10-3画图程序界面主要代码如下:图形选择菜单项单击事件:procedureTForm1.N9Click(Sender:TObject);begingra:=0;//gra全部变量,表示用户选择的图形类型。end;按下鼠标后,虚线绘制图形轮廓代码:procedureTForm1.FormMouseDown(Sender:TObject;Button:TMouseButton;Shift:TShiftState;X,Y:Integer);beginifbutton=mbleftthenbegindrag:=true;xx:=x;yy:=y;x1:=x;y1:=y;canvas.MoveTo(x,y);
end;end;procedureTForm1.FormMouseMove(Sender:TObject;Shift:TShiftState;X,Y:Integer);begincasegraof0,1:ifdragthenbeginif(x1<>xx)and(y1<>yy)thenbegincanvas.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:ifdragthenbeginif(x1<>xx)and(y1<>yy)thenbegincanvas.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:elseifdragthencanvas.LineTo(x,y);end;end;松开鼠标后,实际画图操作:procedureTForm1.FormMouseUp(Sender:TObject;Button:TMouseButton;Shift:TShiftState;X,Y:Integer);begindrag:=false;casegraof0:begincanvas.MoveTo(xx,yy);canvas.Pen.Style:=pssolid;canvas.LineTo(x,y);end;1:begincanvas.MoveTo(xx,yy);canvas.Pen.Style:=psdot;canvas.LineTo(x,y);end;2:begincanvas.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;//情况3—11代码省图,有兴趣的读者请自己补充完整
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;“保存”已绘图形代码:procedureTForm1.N25Click(Sender:TObject);begintempg.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));ifsavedialog1.Executethentempg.SaveToFile(savedialog1.FileName);end;代码中的tempg为一个全局tbitmap对象,在窗体创建时被程序创建,用来临时保存已绘的图像,以保证当窗体重绘时,图像不会丢失,如下代码:procedureTForm1.FormPaint(Sender:TObject);beginform1.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绘制正弦曲线程序运行结果绘制代码如下:procedureTForm1.BitBtn1Click(Sender:TObject);varx,y,i:integer;py:real;begincanvas.MoveTo(0,form1.ClientHeightdiv2);canvas.LineTo(form1.ClientWidth,form1.ClientHeightdiv2);canvas.MoveTo(form1.ClientWidthdiv2,0);canvas.LineTo(form1.ClientWidthdiv2,form1.ClientHeight);fori:=-(form1.clientwidthdiv2)to(form1.ClientWidthdiv2)dobeginpy:=34*sin((imod240)*((2*pi)/240));y:=form1.ClientHeightdiv2-trnc(py);x:=form1.clientwidthdiv2+i;canvas.Pixels[x,y]:=clred;end;end;
实际上,利用对像素点的直接访问,可以实现很多图像处理的特殊效果,比如彩色图像的灰度显示、浮雕化效果等,有兴趣的读者可以自己去尝试。例10-4.图像翻转程序本例演示一个将图片按要求翻转的程序,主要原理是利用CopyRect方法,把源区域和目标区域的对应方向作相应变化即可实现。运行效果如图10-5:图10-5图像翻转程序运行结果主要代码如下:procedureTForm1.BitBtn1Click(Sender:TObject);//打开图片beginifopenpicturedialog1.Executethenimage1.Picture.LoadFromFile(openpicturedialog1.FileName);end;
procedureTForm1.BitBtn2Click(Sender:TObject);//水平翻转begintembmp.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;procedureTForm1.BitBtn3Click(Sender:TObject);//垂直翻转begintembmp.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;procedureTForm1.BitBtn4Click(Sender:TObject);//对角翻转begintembmp.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.4Paintbox组件在程序中,除了可以利用窗体的Canvas对象直接在窗体上绘图外,还可以利用PaintBox组件来作图。该组件在System选项卡上,用它绘图的方法与在窗体上直接绘图类似,不同的是,这时的坐标是以TPainBox组件的Canvas左上角作为坐标原点的,因此不需要考虑其在窗体中的位置。另外,可以在设计期定义该组件的大小和位置,当所绘制图形大与该组件的画布区域时,超出部分将自动切割。与Image组件不同的是,该组件内绘制的图形如果希望在窗体及组件重绘后保持,则必须在其OnPaint事件的处理代码中重绘这部分图形。如下例:新建一VclFormsApplication-DelphiforWin32工程,在窗体上加入一个Button组件,一个PainBox组件,然后编写下面两个事件处理代码:procedureForm1.Button1Click(Sender:TObject);beginPaintBox1.Canvas.Brush.Color:=clRed;PaintBox1.Canvas.FillRect(PaintBox1.Canvas.ClipRect);PaintBox1.Canvas.Ellipse(0,0,100,100);end;procedureForm1.PaintBox1Paint(Sender:TObject);beginPaintBox1.Canvas.Ellipse(0,0,100,100);end; 编译运行该程序,可以看到窗体上出现一个椭圆,单击Button后出现一个红色矩形区域。但当把窗体最小化再还原后,观察图形发现椭圆还在,但红色矩形区域却消失了。10.2多媒体程序设计除了强大的图形图像处理能力,Delphi应用程序同样支持音、视频的处理。在Win32选项卡上的Animate组件可以用来播放无声的AVI视频片断,而MediaPlayer组件则可以提供对常见音、视频格式的处理功能,例如WAV、CD、MIDI、MP3等。10.2.1Animate组件Animate的使用比较简单:将该组件放置在窗体的适当位置,选定要播放的动画剪辑,设定重复播放次数,然后将其Active属性改为True,动画立即开始播放,在设计期就可以看到效果。该组件播放的动话剪辑有两种来源,一种是来自指定的AVI文件,另外一种是Windows的内部动画,如查找、删除文件等。具体设定方法很简单,只需要设置相应属性即可。1.Animate的重要属性1)CommonAVI:用来指定播放Windows系统Shell32.dll中的哪一段内部动画剪辑。这些动画就是系统在用户做文件操作时播放的。其可能的值及说明如表10-4:表10-4可用的预置动画列表
2)FileName:用来指定要从文件中装入的外部AVI动画的文件名。如果装载成功,则自动设置Open属性为True。如果动画中包含有声音,则被忽略。注意:该属性与CommonAVI是互斥的。如果设置FileName属性,则CommonAVI属性会被自动设置为aviNone;如果设置CommonAVI属性为非aviNone值,则FileName属性会被自动设置为空。3)FrameCount:保存TAnimate组件所装载动画的总帧数。4)StartFrame和StopFrame:指定TAnimate组件将要播放动画的起始帧号和结束帧号。帧数序号从1开始。默认情况下,当一个动画被装载后,StartFrame值被设置为1,StopFrame值被设置为FrameCount值,即全部播放。可以通过修改这两个属性以实现只播放一部分帧的功能,但应满足StartFrame<=FrameCount。5)Repetitions:该属性值指定当Active属性为True后,所选动画剪辑的播放次数。当播放完该属性指定次数后,Active属性值自动设为False。当该值小于等于零时,表示不限次数的重复播放,直到将Active属性设置为False或调Stop方法停止播放。6)Open:该属性为Boolean类型,表示TAnimate组件是否已成功装载动画剪辑并做好播放准备。当成功装载动画剪辑后,在没有播放之前,组件会显示动画的第StartFrame帧的画面。当属性值为False时,不会显示任何帧画面。当该属性从False改变为True时,自动设置StartFrame属性为1,StopFrame属性为FrameCount值。7)Active:该属性为Boolean类型,当值为True时,组件从已装载动画剪辑中StartFrame属性指定的帧开始到StopFrame属性指定的帧结束循环播放Repetitions属性指定的次数;当值设为False时,结束播放。默认值为False。只有TAnimate的Open属性为True时(已成功装载动画剪辑),Active属性才可以被设置为True。2.TAnimate的常用方法1)Play方法:过程定义:procedurePlay(FromFrame,ToFrame:Word;Count:Integer);其功能是从第FromFrame帧到第ToFrame帧,循环播放已装载动画剪辑Count次。参数应满足0=<FromFrame<=ToFrame。Count小于等于零表示无限次循环播放,直到调用Stop方法或Active属性被设置为False。若调用前Open属性为False,则Play方法设置其为True。明显地,调用Play方法,相当于设置StartFrame=FromFrame,StopFrame=ToFrame,Repetitions=Count,然后设置Active为True。例:animate1.play(1,24,4);2)Stop方法:过程定义:procedureStop;其功能是停止播放动画剪辑。同理,调用该方法相当于设置Active属性为False。3)Seek方法:过程定义:procedureSeek(Frame:SmallInt);其功能为将播放画面定位到动画剪辑的第Frame帧。Frame值小于等于1时,定位于第1帧,Frame值大于等于FrameCount时,定位于最后一帧。若调用前Open属性为False,则Seek方法设置其为True。例:animate1.seek(5);4)Reset方法:过程定义:procedureReset;其功能是将TAinmate组件恢复到默认状态:关闭并重新打开TAnimate组件,清除StartFrame和StopFrame的值,显示第一帧。在此过程中要触发OnClose和OnOpen事件。10.2.2MediaPlayer组件媒体播放机组件(TMediaPlayer)位于组件面板的System标签页下,它为用户提供了一组按钮用于播放控制,每个按钮的功能对应一个方法。程序运行时,用户可以单击这些按钮来完成相应的的播放控制功能。它们不能被分开作为独立的按钮使用,只作为一个对象来接收鼠标的单击事件,然后通过传递的按钮参数值来确定按下的是哪个按钮。这些按钮功能及类型值如表10-5:表10-5媒体播放面组件按钮名称及功能1.TMediaPlayer的重要属性1)AutoEnable:该属性用于指定TMediaPlayer是否自动设置每个控制按钮是否可用。声明:propertyAutoEnable:Boolean;如果该值为True,则TMediaPlayer会根据Mode属性返回的当前工作状态和DeviceType属性返回的当前打开的多媒体设备类型,决定并设置每个按钮当前是否处于可用状态。它的优先级比EnabledButtons属性高。如果该值为False,则不会进行上述操作,必须通过EnabledButtons属性来设置哪些按钮可用而哪些不能。2)AutoOpen:该属性指定当程序运行时,TMediaPlayer是否自动打开。声明:propertyAutoOpen:Boolean;如果该值为True,当播放器窗口被创建时,TMediaPlayer就会尝试打开由DeviceType属性(如果该属性设置为dtAutoSelect,则根据FileName属性)指定的多媒体设备。如果打开失败,则会产生一个EMCIDeviceError类型的异常,错误类型号将存入Error属性,而相应的错误提示信息则存入ErrorMessage属性中。如果该值为False,则必须调用Open方法才能打开多媒体设备。3)AutoRewind:该属性指定TMediaPlayer是否具有自动返回功能。声明:propertyAutoRewind:Boolean;如果该值为True,并且当前播放位置已处于多媒体文件结尾处,则在播放或录制之前将自动返回到多媒体文件的开始处。如果该值为False,用户必须单击Prev按钮或在程序代码中调用Previous方法才能返回到多媒体文件开始处。但是,如果指定了StartPos或EndPos属性值,或者是多媒体文件是轨道格式,则该属性设置在播放和录制时无效。4)Capabilities:该属性是一个只读的集合属性,用于返回设备当前的可操作状态。声明:typeTMPDevCaps=(mpCanStep,mpCanEject,mpCanPlay,mpCanRecord,mpUsesWindow);TMPDevCapsSet=setofTMPDevCaps;property:Capabilities:TMPDevCapsSet;各值所表示意义如表10-6:表10-6设备状态取值及意义5)DeviceID:该属性为运行时只读型,返回当前打开设备的识别号。如果没有设备被打开,则为0。声明:propertyDeviceID:Word;6)DeviceType:该属性用来指定要打开的多媒体设备类型。声明:typeTMPDeviceTypes=(dtAutoSelect,dtAVIVideo,dtCDAudio,dtDAT,dtDigitalVideo,dtMMMovie,dtOther,dtOverlay,dtScanner,dtSequencer,dtVCR,dtVideodisc,dtWaveAudio);propertyDeviceType:TMPDeviceTypes;默认值是dtAutoSelect,表示根据FileName属性指定的多媒体文件扩展名来自动识别设备类型。通常每种文件扩展名关联一种设备类型。此时,如果没有设备类型与该类型文件相关联,则必须要在DeviceType属性中指定正确的特定设备类型。设备类型的可能取值及意义如下表10-7:表10-7可选的设备类型列表7)Display:该属性用来指定TMediaPlayer用来显示输出的组件,如窗体或面板。默认值为nil,表示程序自已创建输出窗口。声明:propertyDisplay:TWinControl;8)EnabledButtons:该属性是一个按钮类型值的集合,用来指定TMediaPlayer控制面板上的播放控制按钮哪些有效可用,哪些是无效不可用的(灰色显示)。默认情况下所有按钮都可用。声明:typeTMPBtnType=(btPlay,btPause,btStop,btNext,btPrev,btStep,btBack,btRecord,btEject);TButtonSet=setofTMPBtnType;propertyEnabledButtons:TButtonSet;类型值对应的按钮及功能见表10-5。9)VisibleButtons:该属性定义TMediaPlayer控制面板上显示的按钮集合。类型值不包含在该集合里的对应按钮不出现在播放器面板上。TMediaPlayer组件刚添加到窗体时,所有按钮都是可见的。声明:propertyVisibleButtons:TButtonSet;10)FileName:该属性指定要打开或保存的多媒体文件的文件名。声明:propertyFileName:string;11)Length:该属性返回已打开多媒体文件的长度,通常以TimeFormat属性指定格式的时间表示。声明:propertyLength:Longint;12)Frame:该属性指定快进或后退时的步进幅度(帧数),即每次操作的移动长度占多媒体文件总长度的百分比。默认值为10,表示每次移动文件长度10%的位置。声明:propertyLength:Longint;帧的定义根据设备类型有所不同。对于视频而言,一帧通常指一幅静止的画面。13)Mode:该属性返回多媒体设备当前所处的操作状态。声明:typeTMPModes=(mpNotReady,mpStopped,mpPlaying,mpRecording,mpSeeking,mpPaused,mpOpen);propertyMode:TMPModes;其可能值的意义如表10-8:表10-8设备状态列表
14)StartPos和EndPos:这两个属性分别用来指定在已打开的多媒体文件内,进行播放或录制的起始及结束位置,用由TimeFormat属性指定格式的时间表示。它们的值在设定之后的播放或录制操作中有效。设定其值,不影响多媒体文件的当前位置(Position属性值)。声明:propertyStartPos:Longint;propertyEndPos:Longint;15)Position:该属性标记已打开多媒体文件的当前位置,用由TimeFormat属性指定格式的时间表示。声明:propertyPosition:Longint;文件刚打开时,该值默认为文件的起始位置。如果设备支持多轨道格式,则默认位于第一条轨道的起始处。16)TimeFormat:该属性指定描述多媒体文件长度的时间格式。声明:typeTMPTimeFormats=(tfMilliseconds,tfHMS,tfMSF,tfFrames,tfSMPTE24,tfSMPTE25,tfSMPTE30,tfSMPTE30Drop,tfBytes,tfSamples,tfTMSF);propertyTimeFormat:TMPTimeFormats;时间由4个字节组成,各个字节在不同格式时意义不同,其对应关系见表10-9:表10-9可选的时间格式及表示17)Tracks:该属性返回已打开的多媒体设备可供有效播放的轨道条数。该属性对于不是采用轨道格式的多媒体设备无定义。声明:propertyTracks:Longint;2.TMediaPlayer的常用方法1)AutoButtonSet:该方法当AutoEnabl
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 手术室护理专题课件
- 岳飞《小重山》赏析课件
- 商超临期食品处置管理制度
- 《美丽的颜色包航》课件
- 学前儿童身体的生长发育与保健
- 2026-2027年江苏省北师大版高一化学第10单元化学工业习题
- 2025-2026年数字素养能力测试习题集
- 2026-2027年陕西省北师大版八年级物理上册第10章原子物理基础测试卷
- 2026年上海市苏教版初中物理第10章电路综合测试卷
- 《电磁基本知识》课件
- 2026年北京市公安局监所管理总队招聘勤务辅警380名考试备考题库及答案详解
- 广安枣园投资开发集团有限公司 2026年公开招聘工作人员笔试备考试题及答案详解
- 光大证券2027届校园招聘笔试备考题库及答案详解
- 2026年“全国质量月”相关质量知识竞赛试题及答案
- 数据通信设备中心液体冷却指南
- 中医刮痧技术操作规范
- 新生儿窒息复苏指南学习课件
- 包钢加固环氧砂浆抹面方案
- 新版(2026秋新版)北师大版五年级数学上册全册教案合集
- 2026年秋新教材人教PEP版小学英语六年级上册教学计划及进度表
- 2026年广东继续教育公需课《新质生产力与高质量发展》试题及答案
评论
0/150
提交评论