我需要在一个image里实时画图。后来发现canvas的在第一次画上东西时,尺寸已经固定,大小可以有cliprect读出。但是我需要将图像放大,却改变不了canvas的大小,超出范围的都被裁掉。我的方法是,为了保持图形的准确性,我在每次resize的时候,没有选择bitblt,总是重新画图,可是发现了上述的问题。我没有试用bitblt会怎么样,不过如果还是向canvas Copy的话,不是还会遇到同样的问题吗?可能仍旧会有一部分被裁掉。问题有点奇怪,为什么不允许改变canvas的尺寸呢?有没有别的变通的方法?

解决方案 »

  1.   

    你把image 的Stretch属性设置为 true 看看
      

  2.   

    太长了,我贴贴看。image 的Stretch属性我试过了,不行。其效果是将图形缩放,我的图是实时显示的,类似2000中任务管理器的内存使用情况的图形。使用这个属性估计是调用了stretchblt,看起来很不舒服。我的做法是image的大小改变时,将图形区清空,然后重画。这个过程就涉及到了我上面提到的TCanvas的大小不能改变的问题,我试过的。所以现在只能是开始时在最大的canvas上作图,然后朝小的范围缩放,可以达到我的要求。反过来,先在小的canvas上作图,就会出现图像被裁减的问题。
      

  3.   

    简单点。image在panel上,Align属性为alClient。在panelresize事件中,调用自定义过秤,如下:
    procedure TfrmMain.palTimeImgResize(Sender: TObject);
            ......
            ClearCanvas(imgTime);
            DrawCoor(imgTime, tTimeMediaCoor, 'S', strShow, 12, 4);
            DrawScanCurve(imgTime, tTimeMediaCoor, tmTime, tValue, tTimeScanInfo.nMax,
                            tTimeScanInfo.nMin, tTimeScanInfo.nStep);
            ......                
    end;
    三个过程分别为清空作图区,画坐标,画图形。现象如上所述。还有个问题,Align和Anchors属性联合使用时好象会混乱,现在还没有找出规律。继续做。
      

  4.   

    在Image1.resize方法中加入一句
    Image1.Picture.Bitmap.Width := Image1.Width;
    Image1.Picture.Bitmap.Height := Image1.Height;这样就可以啦,而且是不需要重绘的
      

  5.   

    Canvas是抽象的对象,其本身没有大小的概念,它的作用只是封装GDIImage上调用Canvas绘图,会在第一次先创建一个位图对象,第二次就不会再创建了,自然就遇到这状况,可以多看看VCL自身代码