当前位置:文档之家› Delphi如何使用基本的绘图函数绘制统计图

Delphi如何使用基本的绘图函数绘制统计图

一个windows自带的画图工具是无论如何也不能满足我们的画图需要的,很多效果都需要我们在另外的工具中来实现。

这些高级的功能是如何实现的呢,如何操纵一些基本的属性和函数,让它们最终能作出我们想要的效果呢?这里我们以绘制统计图来说明这些问题。

解决思路――这里,我们暂且先撇开具体的问题,综合地一下讨论画图的问题。

画图工具是基本元素的具体实现,对于我们初学者来说,还是有很好的参考价值的,在delphi 5中有一个自带的工程例子“……Borland\Delphi5\Demos\Doc\Graphex”,这个例子可以实现一些基本的绘图功能。

对这个例子多加修改,一定会有所收获的。

这里就不列出它的详细代码了,有心的读者可以自己找到这个例子。

我这里只是想综合地讨论这方面的问题。

使用DELPHI编写绘图软件的灵魂就在于操作画布,画笔和刷子,尽可能地挖掘它们的属性和相关参数的设置。

(一)画布画布,画笔和刷子之间的关系很明了.其实,画笔和刷子都是画布的一个属性.而画布也只是TForm,TImage,TShape等组件对象的一个属性,专门负责与图象相关的信息打交道.它的主要作用可以概括如下几点:1.指定使用画笔,刷子和字体的使用类型;2.绘制和填充指定形状的线或图形;3.修饰和改变图象;画布的主要属性有:Brush--指定填充图形和背景的样式CanvasOrientation--指定画布的定位类型,有coLeftToRight, coRightToLeft两个属性;ClipRect--指定剪切矩形的边界;CopyMode--指定图形图象的复制模式;Font--指定画布上使用的字体;Handle--为画布指定窗口GDI对象的设备描述表;LockCount--指定画布被别的线程锁定的次数;Pen--指定画布上使用的画笔,具体见下面描述;PenPos--指定画笔当前的位置;Pixels--指定当前剪切矩形的象素颜色;TextFlags--指定字体在画布上的显示方式,有ETO_CLIPPED,ETO_OPAQUE,ETO_RTLREADING,ETO_GL YPH_INDEX,ETO_IGNORELANGUAGE,ETO_NUMERICSLOCALETO_NUMERIC SLATIN等值可选;画布相关的API函数及其注释如下:Arc--按指定方式画一条弧;BrushCopy--把位图复制到指定的画布的矩形中,用画布刷子颜色替换位图的颜色;Chord--按指定方式画弦;CopyRect--从一个矩形区域复制部分图象到另一个矩形区域;Draw--用指定参数在指定位置画图;DrawFocusRect--按指定焦点风格,通过异或操作来绘制一焦点矩形;Ellipse--按指定参数画一椭圆;FillRect--按指定的刷子填充一矩形;FloodFill--使用当前选定的刷子填充指定设备描述表中的一块区域;FrameRect--使用指定的方式画一矩形的边框;LineTo--使用当前画笔从当前位置到指定点画一条直线;Lock--防止其它线程在画布上绘图;MoveTo--指定一新的当前画笔位置;Pie--按指定方式画饼状图;PolyBezier--按指定方式画多条贝塞尔线;PolyBezierTo--按指定方式画多条贝塞尔线并更新当前的画笔位置值; Polygon--绘制一个由多个顶点的任意序列组成的多边形;Polyline--使用当前画笔画一系列的多边形;Rectangle--绘制矩形;RoundRect--绘制圆角矩形;StretchDraw--在指定的矩形区域通过指定的绘图参数来绘制图形; TextExtent--返回使用当前字体设置的字符的象素宽度和高度等参数; TextHeight--返回使用当前字体设置的字符的象素高度;TextOut--在指定位置绘制文本,并更新画笔的当前位置;TextRect--在一剪切矩形区域中绘制文本;TextWidth--返回使用当前字体设置的字符的象素宽度;TryLock--对当前没加锁的画布进行加锁;Unlock--对当前加锁的画布进行解锁;例如以下是两个小例子:procedure TForm1.Button2Click(Sender: TObject);varARect: TRect;begin //实现了剪切效果;with Image1.Canvas dobeginCopyMode := cmWhiteness; //设置复制模式;ARect := Rect(0, 0, Image1.Width, Image1.Height);CopyRect(ARect, Image1.Canvas, ARect);CopyMode := cmSrcCopy; //恢复复制模式;end;end;procedure TForm1.Button3Click(Sender: TObject);varW: Word;begin //在窗口中画一条彩线;for W := 10 to 200 doCanvas.Pixels[W, 10] :=RGB(random(255),random(255),random(255));; end;灵活使用这些函数及其内部参数会让我们得到意想不到的效果;(二) 画笔画笔是一个GDI对象,定义了绘制直线或轮廓形状的方法.画笔内部共有五种属性:颜色,句柄,模式,风格和宽度.Color--决定指定直线或轮廓形状的RGB颜色。

Handle--指向了窗口画笔对象句柄。

Mode--指定了画笔以何种方式在画布(canvas)上画线,在帮助文档中的该定义是(全部以pm_开头):type TPenMode =( pmBlack, //总是黑色;pmWhite, //总是白色;pmNop, //颜色不变;pmNot, //画布颜色取反;pmCopy, //颜色属性中指定的画笔颜色;pmNotCopy, //画笔颜色取反;pmMergePenNot, //画笔颜色和画布背景色取反后颜色的结合;pmMaskPenNot, //画笔颜色和画笔背景色取反后颜色共同色的结合;pmMergeNotPen, //画笔颜色取反后和画布背景色的结合;pmMaskNotPen, //画布颜色和画笔颜色取反后颜色共同色的结合;pmMerge, //画笔和画布背景色的结合;pmNotMerge, //画笔颜色和画布背景色的结合;pmMask, //画笔和画布背景色共同色的结合;pmNotMask, //pmMask取反,画笔和画布背景色共同色的结合;pmXor, //取画笔或画布背景中的任一种颜色;pmNotXor //pmXor取反,取画笔或画布背景中的任一种颜色;);Style--则指定了画笔操作的风格,在线文档中的定义是(全部以ps_开头):type TPenStyle=( psSolid, //画笔是───psDash, //画笔是------psDot, //画笔是......psDashDot, //画笔是_._._.psDashDotDot, //画笔是_.._..psClear, //画笔是透明色psInsideFrame //画笔是实线,但设置大于1时会抖动;);另外,在windows.pas中还有其他扩展的画笔风格定义,只在特殊的支持设备上才有效,如PS_ENDCAP_ROUND, PS_JOIN_ROUND等;Width--指定了待使用画笔的宽度,单位是象素.和画笔相关的函数有:CreatePen--用指定风格创建画笔;CreatePenIndirect--根据LOGPEN数据结构创建一画笔;ExtCreatePen-- 创建带指定风格,宽度和刷子属性的几何画笔;(三)刷子刷子定义了区域填充的GDI对象,刷子是一个8×8象素的区域,它可以被绘制在指定的设备上.刷子不仅可以是纯色的,也可以由不同的位图图案组成.刷子的属性有位图,颜色,句柄和风格四种:Bitmap--是指定一个外部位图文件来填充指定的区域.如果指定的图象比填充的区域大,则只有左上角与填充区域等大的部分有效,其余的被自动裁减了.Color--指定了刷子的颜色.当刷子风格为bsClear时,该属性无效.Handle--指向指定设备窗口.Style--则指定了当前刷子的填充风格,在线文档中的定义是(都以bs_开头): type TBrushStyle=( bsSolid, //填充格式为实体填充bsClear, //填充格式为透明填充bsHorizontal, //填充格式为------bsV ertical, // 填充格式为|||||bsFDiagonal, // 填充格式为/////bsBDiagonal, // 填充格式为\\\\\bsCross, // 填充格式为+++++bsDiagCross // 填充格式为xxxxx);和刷子有关的API函数有:CreateBrushIndirect--根据LOGBRUSH创建一刷子; CreateDIBPatternBrushPt--使用设备无关位图来创建刷子,以便指定刷子的模式; CreateHatchBrush--创建一带有阴影模式的刷子,阴影模式为以HS_开头的常数; CreatePatternBrush--用位图来创建刷子,以便指定刷子的模式; CreateSolidBrush--创建一实体颜色刷子;GetBrushOrgEx--获取指定设备描述表中当前选择刷子的原点; GetSysColorBrush--获取和指定颜色索引相关的逻辑刷子的句柄; SetBrushOrgEx--设置指定设备描述表中当前选择刷子的原点;(四)画图和填充相关的API函数;BeginPaint--准备在指定窗口绘画或对指定区域进行填充; DrawAnimatedRects--NT支持函数,画一环有游动边框的矩形;DrawCaption--NT支持函数,为指定窗口的标题赋值;DrawEdge--为指定矩形画一道或多道边框;DrawFocusRect--画焦点矩形;DrawFrameControl--画一指定类型和风格的边框控件;DrawState--NT支持函数,为图象画一可视效果标明其状态;DrawStateProc--NT支持函数,调用为图象画一可视效果标明其状态的函数; DrawTextEx--NT支持函数,在指定区域输出格式化文本;EndPaint--结束绘画;ExcludeUpdateRgn--将窗口无效部分(更新区域)从裁剪区中排除掉;GdiFlush--使当前GDI闪烁;GdiGetBatchLimit--获取缓冲GDI函数数量;GdiSetBatchLimit--设置缓冲GDI函数数量;GetBkColor--获取背景颜色;GetBkMode--获取背景模式;GetBoundsRect--获取边界矩形;GetROP2--获取当前绘图模式;GetUpdateRect--获取指定窗口最小的矩形;GetUpdateRgn--获取描述窗口中无效区的区域;GetWindowDC--获取窗口DC;GetWindowRgn--获取窗口区域;GrayString--在指定位置画灰色文本;InvalidateRect--使DC指定的矩形无效;InvalidateRgn--使DC指定的矩形无效;LockWindowUpdate--禁止或允许在指定窗口中绘画;OutputProc--调用输出进程,向GrayString输送文本;PaintDesktop--NT支持函数,在指定的窗口区域用指定的桌面颜色或墙纸填充裁剪区;RedrawWindow--更新客户区的指定区域或矩形;SetBkColor--设置背景颜色;SetBkMode--设置背景模式;SetBoundsRect--设置边界矩形;SetRectRgn--设置矩形区域;SetROP2--设置当前绘图模式;SetWindowRgn--设置窗口区域;UpdateWindow--更新窗口;ValidateRect--使客户区中指定矩形有效;ValidateRgn--使客户区中的指定区域有效;WindowFromDC--获取和指定窗口相关的句柄;具体实现――1.本例以常见的统计图来说明问题。

相关主题