我是初学者,想练习使用Canvas画图,谁能给详细讲讲?如果有源代码,也最好有注释。我确实太菜了。

解决方案 »

  1.   

    一般的书上都有,你看一下canvas的部分,
      

  2.   


     标题: TCanvas类
        类关系 TObject->TPersistent 
      对那些作图对象,可使用TCanvas对象作为画布。标准的window控件,例如编辑控件和列表框控件,当它们被Windows画出来时,并不需要一块画布。在创建一幅图像时,TCanvas对象提供有用的属性、方法和事件,主要通过以下方法: 
      指定需要使用的刷子、画笔和字体类型。 
      对各类形状和线条进行作图和填充。 
      输入文体。 
      对图像进行着色。 
      对当前图像的变化能作出反应。 
      TCanvas有两个子类,即TControlCanvas和TMetafileCanvas,它们对控件图像的作图和创建对象的图元文件图像有所帮助。 属性列表 
    Brush 决定画布填充图形的背景颜色和填充图案的模式 
    ClipRect 指定剪贴矩形的边界 
    CopyMode 确定如何将复制的图像放到画布上面 
    Font 指定使用文体的字体 
    Handle 是针对画布的Windows GDI句柄 
    LockCount 表示画布被锁定的次数 
    Pen 指定使用的画笔种类 
    PenPos 指定画笔当前的作图位置 
    Pixels 指定当前ClipRect中点的颜色 方法列表 
    ~TCanvas 释放TCanvas占用的内存 
    Arc 在图片上画出一段弧线 
    BrushCopy 制位图的一部分到位于画布上的矩形中 
    Chord 画一个由一条直线和一个椭圆相交所的的闭合图形 
    CopyRect 将另一画布上图形的一部分复制到这个画布上 
    Draw 在画布上输出由Graphic参数指定的图像 
    DrawFocusRect 画一个矩形框表示矩形内的控件对象具有输入焦点 
    Ellipse 在画布上画椭圆 
    FillRect 使用当前刷子填充画布上指定的矩形 
    FloodFill 使用当前刷子填充画布上的一块区域 
    FraneRect 画出一个矩形的边框 
    LineTo 在画布上画一条从当前画笔位置到指定点(x, y)的直线 
    Lock 使其他线条不在画布上画出 
    MoveTo 使当前作图位置移到点(x, y) 
    Pie 在画布上画一个扇形 
    PolyBezier 画一簇Bezier曲线 
    PolyBezierTo 画一簇Bezier曲线并更新PenPos的值 
    Polygon 在画布上画出闭合图形 
    Polyine 在画布上画出一系列链接点数组中的每一个点的直线 
    Rectangle 在画布上画出一个矩形 
    Refresh 从设备场境里删除 Pen、Brush 以及 Font 
    RoundRect 在画布上画出一园角的矩形 
    StretchDraw 画出由 raphic 参数指定的图像 
    TCanvas 创建一介 TCanvas 对象的实例 
    TextExtent 返回字符串的像素宽度和高度 
    TextHeight 返回字符串的像素高度 
    TextOut 在画布上从点(x,y)处开始输出一字符串 
    TextRect 在剪切矩形区内输出字符串 
    TextWidth 返回字符串的像素宽度 
    TryLock 调用TryLock 将锁定画布 
    Unlock 使LockCount 属性值减少 事件列表 
    OnChange 当画布上的图像刚发生变化时OnChange事件发生 
    OnChanging 当画布上的图像刚发生变化时OnChanging事件发生 属性 
    TCanvas::Brush 
      决定画布填充图形的背景颜色和填充图案模式。 
     __property TBrush* Brush = { read =FBrush, write =SetBrush }; 
      通过设置 Brush属性的属性,指定作图背景颜色和填充图案的模式。Brush 属性值为TBrush 对象。当在画布上填充一个空间时,通过设置TBrush 对象的属性,可以指定可以使用的颜色、模式或者位图。 
      注意:设置Brush 属性是为分配指定的TBrush 对象,而不是替代当前的 TBrush 对象。 TCanvas:::ClipRect 
      指定剪贴矩形的边界。 
     __property Windows:::TRect ClipRect = {read =GetClipRect }; 
      使用ClipRect权属性用来限定画布的作图区域。任何坐标在ClipRect 属性以外的作图将被剪切掉并且不会出现在图像中,例如,在一个较小的框中画一个大圆的一部分,首先画框,然后对由框的内边界限定的矩形进行ClipRect属性设置 。此时,画整个圆将显示在框内部分。 
    当处理窗体的OnPaint 事件时,画布的ClipRect 属性被设置成所需着色的矩形。不与ClipRect 重叠的图像部分,不必画出。因此,OnPaint 例程能够使用 ClipRect 属性的数值,对着色进行优化,并加速应用软件的全面运行。 TCanvas::CopyMode 
      确定如何将复制的图像放到画布上面。 
     __property int Copy Mide = {read = FCopyMode, write = FCopyMode, default = 13369376 }; 
      设置copyMode属性,可以改变画出的图像到画布上面的路径。当使用CpyReet 方法从另外的画布上复制图像时,使用CopyMode属性。当TBitmap 对象画它们自身到一个画布上时,CopyNode属性还被TBitmap对象使用。 
      下表给出了CopyMode属性可能的取值,并对每一取值进行了描述。 
    取值 说 明 
    cmBlackness 用黑色填充画布的矩形目标 
    cmDstInvert 忽略源图,将画布上的图像反转 
    cmMergeCopy 将画布上的图像与源位图进行AND操作 
    cmMergePaint 将画布上的图像与反转的源位图进行OR操作 
    cmNotSrcCopy 复制反转的源位图与画布 
    cmNotSrcErsae 将画布上的图像与源位图进行OR操作,然后再反转 
    cmPatCopy 复制源式样至画布 
    cmPatInvert 将画布上的图像与源式样进行XOR操作 
    cmPatPaint 使用OR操作使反转的源位图与源式样结合,并将操作结果与画布上的图像进行OR操作 
    cmSsrcAnd 将画布上的图像与源位图进行AND操作 
    cmSrcCopy 复制源位图至画布 
    cmSrcErase 将画布上的图像进行反转,然后将其与源位图进行XOR操作 
    cmSrcInvert 将画布上的图像与源位图进行OR操作 
    cmWhiteness 用白色填充画布上的矩形目标 TCanvas::Font 
      当在图像上写的文本时,使用Font属性指定使用文本的字体 
     __property TFont* Font = { read = FFont, write = SetFont } ; 
      对图像上的文本,使用Font属性可以指定使用文本的字体。Font 属性的数值是TRont 对象。设置TFont对象的属性,可以指定使用字体的外观、颜色、大小以及风格等。 
      注意:仅对指定TFont对象的 Font 属性进行指定,而不是替代当前的TFont对象。 TCanvas::HandIe 
      是针对画布的Windows GDI句柄。 
     __property HDC HandIe = { read = GetHandIe write = SetHandIe ,nodefauIt } ; 
      对于卷入画布的设备场境,必须设置HDC 的Handle 属性。当窗口控件对Windows 着色信息进行响应时,绘图所需的HDC 即转化为PrtDeviceContext 方法 。在其他情况下,通过调用控件的GetDeviceContext方法,也能获得HDC。此外,对打印机或者存储器,Windows 还提供了能够获得HDC的API调用方法。 
      读Handle 属性可以对由使用需要设备场境句柄的进行API调用的TCanvas 对象提供绘图设备进行补充。绝大多数的Windows GDI调用,需要HDC。 
      TCancas对象没有自己的HDC。应用软件必须建立一个HDC,并对Handle 属性进行设置。当画布不再需要时,应用软件应释放HDC。对已有效一个有HDC画布,进行Handle属性进行设置时,将不能自动释放初始的HDC。 
      注意:TCanvas 对象的一些字体,如TControlCanvas , 有其自己的HDC。不要为这些对象设置Handle属性。它们使用并释放自己的Handle属性。 
     
      
      

  3.   


    TCanvas::LocKcount 
      表示画布被锁定的次数,以避免与其他线条相冲突。 
     __properrty int LockCount = {read = FLockCount,nodefault }: 
      读LockCount属性可以查明画布是否被锁定。每当调用Lock方法防止画布与其他线条相冲突时,LockCount属性增加。调用Unlock方法时,LockCount 属性减少。当LockCount属性为0时,其他线条可以在画布上画出。 TCanvas::Pen 
      指定画布为画线和画图形轮廓而使用的画笔种类。 
     __property TPen * Pen + {read = FPen, write =SetPen }; 
      在一幅图像中,设置Pen 属性可指定画线和画图形轮廓而使用的画笔种类。Pen属性的数值是TPen对象。设置TPeb对象的属性,可以指定画笔的颜色、风格、宽度以及样式等。 
      注意:仅对指定TPen 对象的Pen属性进行设置,而不是替代当前的TPen对象。 TCanvas::PenPos 
      用来指定画笔当前的作图位置。 
     __property tag POINT penPos = {read = GetPenPos , write = SetPos }, 
      读 PernPos 可以知道画笔当前的傻图位置。它是用 LineTo 方法作图的起始点位置。设置 PenPos 属性相当于调用 MoveTo 方法 。 TCanvas::Pixels 
      指定当前 ClipRect是中点颜色。 
     __property TColor Tixels [ int Y ] = { read = Get Pixel , write = SetPixe } '; 
      读取Tixels 读属性可以知道位于具体像素位置的画面颜色。写Pixels属性可以改变画面上某个特定像素的颜色。使用Pixels 属性可以细化图像效果。Pixels 属性还可以用于确定被FillRect方法使用的颜色。 
      不是每一个设备场境都支持Pixels属性。这样的设备场境,读出的Pixels属性返回值为--- 1。则对这样的设备场境进行Pixels 属性设置是没有用的。 
      注意: Pixels属性仅对位于当前Cliprect 数值内的像素有效。 方法 
    TCanvas::~TCanvas 
      删除一个TCanvas的实例。 
     __fastcall virtual ~ TCanvas(void); 
      在应用程序中,不要直接调用~TCanvas,而应调用delete。 
      ~TCanvas首先释放为Font、Brush和Pen属性创建的TFont、TBrush和TPen对象。然后再释放TCanvas对象的内存。 TCanvas::Arc 
      沿由指定矩形确定的椭圆的边,可以在图片上画出一段孤线。 
     void __fastcall Arc{int X1, int Y1, int X2, int Y2, int X3, int Y3, int X4, int Y4}; 
      使用Arc过程,用当前画笔画一个椭圆形曲线。弧线横跨以点(x1, y1)和点(x2, y2)为边界的椭圆边。根据椭圆形周长,按照逆时针方向,从起始点至结束点画出弧线。起始点为椭圆中心和点(x3, y3)确定的直线与椭圆的交点。结束点为椭圆中心和点(x4, y4)确定的直线与椭圆的交点。注意:在Windows95中,x1+x2的和,以及y1+y2的和,不能超出32768。而且,x1+x2+y1+y2的和也不能超出32768。在Windows NT中,使用Windows API调用SetrcDirection方法,画弧线的方向可以改变为顺时针方向。 TCanvas::BrushCopy 
      复制位图的一部分到位于画布上的矩形中,并且用画布刷子的颜色替代图像的颜色。 
     void__fastcall BrushCopy(const Windows::TRect & Dest, TBitmap * Bitmap, const Windows::TRect & Source, Tcolor color); 
      使用BrushCopy可以获得诸如使复制图片部分透明这样的特殊效果。BrushCopy过程具有向后兼容性能。使用TImageList方法可以替代BrushCopy过程。为了使运用BrushCopy过程复制出来的图片具有部分透明效果,应当指定画布表面的颜色(如clBackground)作为Brush属性的Color参数,然后调用BrushCopy过程。 TCanvas::Chord 
      画一个由一条直线和一个椭圆相交,所构成的闭合图形。 
     void__fastcall Chord (int X1, int Y1, int X2, int Y2, int X3, int Y3, int X4, int Y4); 
      使用Chord可以创建一个由弧形及链接弧形两个端点的直线所构成 的图形。弦是椭圆以点(x1,y1)和点(x2,y2)为边界的一部分。椭圆被点(x3,y3)和点(x4,y4)之间的一条直线分割成两部分。 
      弦的边从点(x3,y3)开始,按逆时针方向沿椭圆运行到点(x4,y4),最后一直回到点(x3,y3).如果点(x3,y3)和点(x4,y4),不在椭圆表面上,相应的弦的拐点,取在椭圆边上截断直线最接近的点。使用Pen属性数值可以画出弦的轮廓,使用Brush属性数值可以对图形进行填充。在Windows95中,x1+x2的和,以及y1+y2的和,不能超出32 768。而且,x1+x2+y1+y2的和也不能超出32 768。在Windows NT中,使用Windows API调用SetArcDirection方法,画弦的方向可以改变为顺时针方向。 TCanvas::CopyRect 
      将另一个画布上图形的一部分复制到这个画布上。 
     void__fastcall CopyRect (const Windows::TRect& Dest, TCanvas* Canvas, const Windows::TRect & Source); 
      使用CopyRect过程,可以将另一个画布上图形的一部分,转移到TCanvas对象的图片上。Dest参数,指定了将要复制的源图形存放在画布上的矩形区域。Canvas参数指定与源图像相关的画布。Source参数指定将要复制的源画布部分的矩形区域。源画布部分,通过使用CopyMode方法的指定模式来进行复制。 TCanvas::Draw 
      在给出的坐标(X,Y)位置处,Draw在画布上输出由Graphic参数指定的图像。 
     void __fastcall Draw(int X, int Y, TGraphic* Graphic); 
      调用Draw可以在画布上画出一个图像。Draw调用图形的Draw方法。图片输出到一个图形大小确定、左上角位于点(X,Y)处的矩形区域。 
      图像可以是点位图、图标或者图元文件。如果图像是一个Bitmap对象,点位图通过使用CopyMode方法的数值输出。 TCanvas::DrawFocusRect 
      画一个矩形框,通常用于表示矩形内的控件对象具有输入焦点。 
     void __fastcall DrawFocusRect( const Windows::TRect &Rect ) ; 
      当控件获得或失去输入焦点时,调用DrawFocusRect可以画出控件图片的边框。因为DrawFocusRect使用XOR功能,因此,当第二次调用drawFocusRect时,相同的矩形框将从屏幕上消失。 
      使用DrawFocusRect 画了出的矩形框,为能进行滚动。为了滚动由DrawFocusRect 画出的包含矩形框的区域,首先调用DrawFocusRect ,从屏幕上移去矩形框,滚动该区域,然后再调用drawFocusRect , 在新位置上画出矩形框。 TCamvas::Ellipse 
      在画布上的矩形范围内画椭圆。 
    void __fastcall Ellipse (int X1,int Y1,int X2,int Y2 ); 
      调用Ellipse过程,可以在画布画圆或者椭圆。矩形范围的左上点位于像素坐标(x1,y1).矩形范围的右下点位于像素坐标 (x2,y2).。如果矩形窗体有所有点构成一个正方形,则将画出圆形。使用Pen属性的数值,可以画出椭圆轮廓;作用Brush属性的数值,可以对椭圆进行填充。 
      注意: 在Windows95中,x1 + x2 的和,以及 y1 +y2 的和,不能超出32768。而且,x1 +x2 +y1 +y2的和也不能超出32768。 TCanvas::fillRect 
      使用当前刷子填充画布上指定的矩形。 
     void__fastcall Rloodfill (int X, int Y ,TColor Color,TFillStyle FillStylr ) ; 
      使用Brush属性的数值,调用FloodFill 过程对可以一个非矩形区域进行填充,被填充区域的边界,从点(x,y,) 开始向外扩充,直到遇到Color参数指定的颜色边界为止。 
    FillStyle参数,确定了边界颜色变化类型,用下表进行表示。 数值 说明 
    fsSurface 填充所有由Color参数指定的颜色区域。当遇到另一种颜色时停止 
    fsBorder 填充所有由非Color参数指定的颜色区域。当遇到Color 参数指定的颜色边界时停止   当使用FillStyle参数为fsSurface的FloodFill过程时,使用Pixels属性可以获得位于点( x ,y )处的颜色的确切数值,类似地,当使用FillStyle参数为faBorder的FloodFill过程时,如果直到边界上的点,则使用Pixels属性可以获得边界颜色的确切数值。 TCanvas::FrameRect 
      使用画布的Brush属性,画出一个矩形的边框。 
     void__fastcall framsRect ( const Windows ::TRect &Rect ) ; 
      使用FrameRect可以画出一个像素宽的矩形区域有边界。FrameRect过程对矩形内部不用Brush属性进行填充。 
      通常,使用Polygon方法画一条边线,而不使用Pen方法 。 TCanvas ::LineTo 
      在画布上画开条从当前画笔位置到指定点(x,y)的直线,并且将画笔位置设置为点(x,y)。 
     void __fastcall LineTo (int X ,int Y); 
      使用LineTo可以画一条从当前画笔位置到指定点(x,y)的直线,但不包括点 (x,y)。 LineTo 将画笔位置设置为点(x,y)。 TCanvas::Lock 
      可以使其他线条不在画布上画出。 
     void __ fastcall Lock(void ); 
      在需要画多条线条的应用程序中,调用Lock过程可以使其他线条不在画布上画出。除非调用了UnLock方法,否则Lock过程可以使应用程序中的所有其他线条不会画出,嵌套调用Lock, 使LockCount属性增加,以致使画布上进行作图,除非最后一个锁定被释放。 
      由于Lock可以使所有其他线条不会画出,因此Lock对执行情况具有负影响,除非存在其他线条可能妨碍再画布上进行作图,则不要调用Lock 。 TCanvas::MoveTo 
      使用当前作图位置移到点(x,y). 
     void __ fastrall MoveTo ( int X , int Y ) ; 
      在调用LineTo之前,使用MoveTo可以对画笔位置数值进行设定。调用MoveTo的作用与设定画笔位置属性的作用相同。 
      

  4.   

    delphi5开发人员指南里有个例子,你有吗?想要的话留个mail吧。
      

  5.   

    www.linjun.com里面有几本好书下载,你可以去看一下,会有好处。
      

  6.   

    新建一个应用程序,添加一个按钮Button1到Form1中,然后双击按钮,在光标处键入:Canvas.
    你就凭着想象挨个试呗。
    同意“小志”同志说的,要相信自己!