另外,有些人会说:
你在开始时把Image的Width,Height设为足够大,不就行了吗,这个方法的确有效,但不是我所希望的,因为这样是有潜在问题的。并且这种方法实际上ClipRect区域还是初始值,并没有被以后的操作改变。

解决方案 »

  1.   

    ClipRect的作用是设定Canvas的重画区域。每次重画时,系统只会刷新ClipRect内的内容。它应该是可以设置的,但是现在我记不起来用哪一个函数了。你查一下帮助,里面应该有的。如果你愿意等的话,我明天可以给你答复。:)
      

  2.   

    clipRect跟你要绘的图形有关,图形多大,clipRect自动优化与之相匹配!
    所以,你得想别的办法了!
    祝节日快乐!
      

  3.   

    使用Windows的裁剪函数就行了参见HRGN, CreateRectRgn(这一组还有很多的功能强大的函数), SelectClipRgn, DeleteObject等.至于ClipRect属性,正如楼上酷狗所说,是系统用来告知程序,窗体的那一部分需要重绘的.当然程序也可以置之不理,但是如果只针对这一区域进行绘制的话,就能够省不少的时间,尤其是当绘制复杂的图形的时候.
      

  4.   

    不好意思,今天才给你答案。不过其实楼上已经给出了相关的函数,你找一下那些函数的相关说明,应该可以解决问题了。下面我举一个例子。在一般情况下,ClipRect是与Canvas的面积的同等大小的。而且它是只读属性,所以不可更改。但是我们可以利用API函数来重新设置ClipRect.如下所示void __fastcall TForm1::ButtonClick(TObject * Sender)
    {
    HRGN myRgn;
    myRgn = ::CreateRectRgn(100,100,200,200);
    ::SelectClipRgn(Image1->Canvas->Handle, myRgn);
    Ellipse(Image1->Canvas->Handle, 90, 90, 290, 290);
    Image1->Invalidate();
    ::SelectClipRgn(Image1->Canvas->Handle, NULL);
    ::DeleteObject(myRgn);
    }首先,调用API函数CreateRectRgn定义一个区域。
    然后,调用SelectClipRgn把这个区域作为裁剪矩形。SelectClipRgn函数有两个参数:一是DC,这里既是Canvas->Handle,二是所要选择的区域。
    紧接着,画一个椭圆,并调用Invalidate方法。此时VCL将读入定义的ClipRect,接着画图。
    在第二次调用SelectClipRgn时,把NULL传给他的第二个参数,即恢复原来的裁剪区域。
    最后调用DeleteObject来释放此区域。
      

  5.   

    感谢帮助,我也通过问别人得到了另一种方法,与大家共享,
    就是更改Canvas.Picture的宽高就可以了。
    好了,结帐了。