您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 公司方案 > Delphi 6集成开发环境07
第7章图形与图像由于Windows是一个图形界面的操作系统,所以传统的Windows程序设计方法在处理有关图形设计时,多半是遵循着Windows诞生以来的方法,通过所谓的GDI(GraphicsDeviceInterface)来进行图形的绘制。GDI式的绘图法对于早期曾经在Dos下自行编写绘图单元的程序设计师来说,虽然减少了许多类似于“重新发明轮子”的麻烦,但是相对地也带来另外一种程序设计的思维模式转变,相信曾经经历过这段过程的人都还心有余悸。对于完全没有任何程序设计经验的初学者来说,庞大复杂的GDI绘图系统更是一个难以跨越的学习障碍。但是,在Windows中不是没有一个简易可行的绘图方法。本章要为你介绍的Delphi绘图系统,就提供了一个高度抽象化的绘图单元,让你可以用非常直观的方式来实现Windows下的绘图功能。在Delphi中,专门定义了一组对象和部件用以绘制图形,并能完成一些简单的图像功能。利用这些对象、部件的方法,可以方便地绘制各种常用图形;通过设置它们的属性,能得到不同风格的图形。另外,通过对鼠标事件的定义,可以方便的设计图形绘制程序。7.1常用图形对象及简单应用绘制图形一般要涉及到在什么地方绘图,使用何种颜色画和使用何种填充图案等问题。Delphi为用户提供了一个专供绘图的画布Canvas,每一个具有Canvas属性的对象,都可以作为绘制图形的环境。例如,对于TForm对象(通常所说的窗口),它也有Canvas属性,换句话说,可以直接在窗体绘制各种各样的图形。7.1.1画布对象(TCanvasObject)TCanvas对象是一个用于绘图的表面,在这个区域上,程序可实现各种绘图功能,很多组件(如TIMage,TMemo、TPaintBox等)的Canvas属性就是TCanvas对象。为了在一个组件上创建图形,TCanvas类中的成员调用WindowsGDI函数。Canvas属性是对WindowsGDI的一个综合的、面向对象的封装。Canvas总是准备着被使用,对它自己来说是一个对象。下面我们通过一个简单的例子来说明如何利用Canvas属性来绘图。启动Delphi6,新建一个应用程序。为窗体Form1的OnPaint事件添加如下代码:procedureTForm1.FormPaint(Sender:TObject);beginForm1.Canvas.TextOut(10,10,'CanvasObject');Form1.Canvas.RoundRect(60,60,200,140,10,10);end;编译并运行该程序,结果如图7-1所示。在上面的程序中,我们应用了Canvas的TextOut和Ellipse方法,分别是输出一行文字和画一个圆角矩形,输出文本的字体、圆角矩形的线条和填充色都是采用的默认值,通过改152第7章图形与图像变Canvas的属性可以使输出的结果更加美观。图7-1Canvas应用实例下面我们再来看一个小程序,打开一个新工程,为窗体Form1的OnPaint事件添加如下代码:procedureTForm1.FormPaint(Sender:TObject);varA,x1,y1,x2,y2:Double;D:Integer;i:Integer;E,M_PI:Double;beginD:=100;M_PI:=3.1415926535897932;fori:=0to720dobeginA:=i*M_PI/360;E:=D*(1+sin(4*A));x1:=320+E*cos(A);x2:=320+E*cos(A+M_PI/5);y1:=240+E*sin(A);y2:=240+E*sin(A+M_PI/5);Canvas.MoveTo(Round(x1),Round(y1));Canvas.LineTo(Round(x2),Round(y2));end;end;运行该程序,结果如图7-2所示。第7章图形与图像153图7-2Canvas应用实例怎么样,酷吧。我们只是利用了Delphi的Canvas绘图的基本观念和几个简单的基本函数就做出了这么美丽的电脑绘图。TCanvas对象很多方法,可完成常用的绘图功能,现将方法及功能简介如表7-1:表7-1TCanvas对象的方法方法名称函数形式函数功能ArcArc(X1,Y1,X2,Y2,X3,Y3,X4,Y4:Integer)在椭圆上画一段弧,椭圆由(X1,Y1),(X2,Y2)两点所确定的椭圆所决定。弧的起点是椭圆圆周和椭圆中心与(X3,Y3)连线的交点。弧矩形终点是椭圆圆周和椭圆中心与(X4,Y4)连线的交点,以逆时针方向画弧ChordChord(X1,Y1,X2,Y2,X3,Y3,X4,Y4:Integer)连接椭圆上的两点,椭圆由(X1,Y1),(X2,Y3)两点所确定的矩形决定,(X3,Y3)是始点,(X4,Y4)是终点BrushcopyBrushcopY(constDest:TRect;Bitmap:TBitmap;constSource:TRect;Color:TColor)把位图的一部分复制到画布的某个矩形区域,并用画笔的当前颜色替换位图的颜色。参数Dest定义画布的一个矩形区域,该矩形用以填充位图,Bitmap定义位图;Source定义位图中的矩形区域,该区域上的位图将被复制;Color定义画笔中,用以替换位图的颜色CopyRectCopYRect(constDest:TRect;Canvas:TCanvas;constSource:TRect)从另一个画布对象上复制部分图像到该画布。Canvas表示源画布,Source是源画布上要复制的图像区域。Dest表示目标画布上将接受复制DrawDraw(X,Y:Integer;Graphic:TGraphic)在画布给定的像素点坐标(X,Y)处画Graphic所给的图像,该图像可以是位图,图标或元位图154第7章图形与图像(续表)方法名称函数形式函数功能EllipseEllipse(X1,Y1,X2,Y2:Intege)Ellipse(constRect:TRect)在画布指定的矩形边界上画一椭圆,(X1,Y1)是矩形左上角的像素坐标,X2,Y2是矩形右下角的像素坐标。如果矩形形成一个区域,将出现一个椭圆LineToLineTo(X,Y:Integer)从当前位置画一条线至(X,Y)所指定的位置,并把笔的位置移至(X,Y)MoveToMoveTo(X,Y:Integer)将笔的当前位置设置到点(X,Y)处,笔的当前位置在PenPos属性中,改变笔的当前位置使用MoveTo方法,不要设法改变PenPos的值PiePie(X1,Y1,X2,Y2,X3,Y3,X4,Y4:Integer)绘制椭圆的一部分,椭圆由(X1,Y1),(X2,Y2)所指定的矩形所决定,绘制的那部分由椭圆中心到(X3,Y3),(X4,Y4)两点的两条辐射线所决定PolygonPolygon(Points:arrayofTPoint)在画布上绘制一系列的点,各点依次连成线,昀后将首尾两点相接形成一个区域,并用当前笔刷填充此区域PolylinePolyline(Points:arrayofTPoint)在画布上用当前画笔绘制一系列的点,各点依次连成线RoundRectRoundRect(X1,Y1,X2,Y2,X3,Y3:Integer)在画布上用当前画刷绘制圆角矩形,(X1,Y1)是矩形的左上角,(X2,Y2)是矩形的右下角,X3和Y3分别对应椭圆弧的宽和高StretchDrawStretchDraw(constRect:TRect;Graphic:TGraphic)在Rect参数指定的矩形内画一图像,图像延伸改变大小以适应矩形RectangleRectangle(X1,Y1,X2,Y2:Integer)Rectangle(constRect:TRect)在画布上用当前画刷绘制矩形,(X1,Y1)是矩形的左上角,(X2,Y2)是矩形的右下角DrawFocuseRectDrawFocusRect(constRect:TRect)绘制一矩形以指示此矩形获得焦点。此方法是异或(XOR)函数,第二次调用时原有矩形将消失。DrawFocuseRect绘制的矩形不能滚动。要实现滚动功能则先调用此方法使矩形消失,待滚动过后重新绘制另外,在使用Canvas时还要注意:当窗口进行重画时,画布上的图像将消失,比如当窗口进行昀小化又重新恢复时,就会引起画布上图像的消失,另外当刚刚运行程序时,窗口也是属于重新绘制,所以如果在绘制窗口之前在画布上绘图,弹出窗口后将不能显示出图像,比如在TForm1.FormCreate()事件中进行画布绘图操作将是徒劳的,但可以在此事件中进行画布操作的准备工作,比如设置画笔的颜色和宽度等。7.1.2画笔对象(TPenObject)使用TPen类可以描述Windows的笔(Pen)属性,应用程序常用TPen对象在画布上绘制各种线段。所有和线条有关的绘图函数都会受TPen影响,如LineTo,Ellipse,Polygon,第7章图形与图像155PolyLine,Rectangle等函数都使用画笔来画线,基本上我们可以将这些绘图工具归类为向量式的绘图工具,所有的向量式绘图工具都使用Pen来进行画线的动作。我们可以利用Canvas.Pen来存取Pen,借此修改Pen的性质,画笔的颜色在Color属性中定义,线段宽度在Width属性中定义,类型和模式则分别在Style和Mode属性中定义。Color属性控制线的颜色,可以采用颜色向量描述颜色,如clBlack(黑色)、clBlue(蓝色)和clGreen(绿色)等。Style属性确定线的式样,可以采用式样常量描述式样,如psSolid(实线)和psDash(短线)等。Style属性的具体取值和含义如表7-2所示。表7-2Style的取值和含义Style取值含义pSolid画实线段pSDash画由下划线组成的线段pSDot画由点组成的线段psDashDot画点划线psDashDotDot画双点划线psClear画看不见的线段psInsideFrame画边界的矩形线框新建一个工程,设置Form1的Color属性为clWhite,将下面的代码加入窗体的onClick事件过程中,运行程序,单击窗体便可画出如图7-3所示的各种线型。procedureTForm1.FormClick(Sender:TObject);vari:Integer;beginfori:=0to6dobeginCanvas.Pen.Style:=TPenStyle(i);Canvas.MoveTo(110,10+i*20);Canvas.LineTo(250,10+i*20);end;end;图中从上到下对应的样式变量名为psSolid,psDash,psDot,psDashDot,psDashDotDot,psClear和psInsideFrame。注意psClear没有在图中显示。156第7章图形与图像图7-3绘制不同线型的直线Width属性确定线的宽度,默认宽度为1,如果小于1,Pen的宽度还是选用1。Width的取值影响Style,例如在前面绘制图7-2的循环语句之前加入一条代码:Canvas.Pen.Width:=2;可以获得如图7-4所示的图形,Width影响了Style的各种线型。图7-4Width属性对Style属性的影响下面我们来看一个使用不同线型来绘图的例子,新建一个工程,将窗体的Color属性设为clWhite,并为OnClick事件添加如下代码:procedureTForm1.FormClick(Sender:TObject);vari:Integer;x1,y1,x2,y2:Integer;beginfori:=4downto0dobeginCanvas.Pen.Width:=i;x1:=(ClientWidthdiv2)-(i+1)*30;x2:=(ClientWidthd
本文标题:Delphi 6集成开发环境07
链接地址:https://www.777doc.com/doc-904203 .html