在image1画图时在画布上添加元素多的情况下,占用内存多将导致死机.
还有怎么放大与缩小画布?
核心代码如下:private
  OffSrc:TBitMap;
  picList:Tlist; //存放画布上的元素
  selpic:TBasepic;//基础类
  LinePic:TLinePic; //直线 是自己定义的一个类
  CircPic:TCircPic; //圆
  ... //等procedure TForm1.FormCreate(Sender: TObject);
begin
  //创建对象
end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
//释放对象
end;procedure TForm1..PicDrawEndEvent(Pic: TComponent); //添加图形元素
var
  PicLine:TLinePic;
  PicCirc:TCircPic;
begin
  Case TPicBase(Pic).PicId of
    PIC_LINE:
        begin
          PicLine:=TLinePic.Create;
          PicLine.AssignPic(TLinePic(Pic));
          PicLine.PicIndex:=PicList.Count;
          PicList.Add(PicLine);
        end;
    PIC_CIRC:
        begin
          PicCirc:=TCircPic.Create;
          PicCirc.AssignPic(TCircPic(Pic));
          PicCirc.PicIndex:=PicList.Count;
        end;
  GetImageCanvasBmp(False,True,[ssDouble],0);
end;procedure Tfrm1_Main.GetImageCanvasBmp(DisChoose:Boolean; DrawToImage:Boolean; //刷新代码
                                Shift: TShiftState; State: Integer);
var
  i1:Integer;
begin
  OffSrc.Canvas.Brush.Color:=clBlack;
  OffSrc.Canvas.FillRect(Rect(0,0,OffSrc.Width,OffSrc.Height));  For i1:=0 to PicList.Count-1 do begin
    TPicBase(PicList.Items[i1]).DrawPic(OffSrc.Canvas);
  end;  if DrawToImage then image1.Canvas.Draw(0,0,OffSrc);
  Image1.Picture.Bitmap:=OffSrc;
end;

解决方案 »

  1.   

    在Image上这样画的效率太低了,每次把整幅变成黑的就很慢。
    试试PaintBox呢,看会不会好一点。
      

  2.   

    放大和缩小也很简单,找一个参考点,比如屏幕中心或者左上角,然后所有点距参考点的距离修正就行了。比如一个直线,(100,100)-(200,200),长度为100*1.414
    你以左上角为参考点,所有点的坐标缩小一半,就是(50,50)-(100,100),那么这直线就缩小了一半,长度为50*1.414。(缺点是缩小都向左上角,放大都向右下角。)如果你要避免上述的缺点,像photpshop那样原地放大,缩小(即向四周散开),就比较麻烦。除了上面修正坐标外,还要移动图形。
      

  3.   

    在内存建立一个tbitmap,然后所有的操作都在上面画,画完后再bitblt到image上,放大时,只将tbitmap里的一小块stretchblt到image便可以了.