使用delphi的Image控件,采用双缓冲区画图形,每条曲线的颜色不一样,画图的时候好慢哟。各位同仁有没有可行的快速的方法,帮帮小妹吧。线条大概有30条吧。
我每次画线调用的代码如下:
  Mypen.lopnclolor:=对应的线条颜色;
  Ppen:=createpenIndirect(Mypen);
  Selectobject(MemDC,Ppen);
  MoveToEX(MemDC,x1,y1,nil);
  LineTo(MemDC,x1-1,y1-1);
  x1:=x1-1;
  y1:=y1-1;
  DeleteObject(Ppen);
其中x1,y1是上一个点的值,x1-1,y1-1是新数据计算出来的新点的值。
请各位大侠帮帮我吧。或者有其他可好的方法??

解决方案 »

  1.   

    第一:
    Image 图象的意思,明显它是用来处理图象更合适,
    PaintBox 绘制容器,明显它是用来自己绘图的
    因此可以看出在选择控件上有问题第二:
    Delphi已经封装好了的Canvas不用,而选择API,关键是你选择API也不是这么用的吧
    每画一条线都要Create,Select,Delete,当然慢了,用Image时,看看这个代码,效率肯定没PaintBox快
    var
      i , X , Y , Color : integer;
    begin
      Color := $000000;
      for X:=0 to Image1.Width-1 do begin
        Image1.Canvas.Pen.Color := Color;
        for Y:=0 to Image1.Height-1 do begin
          Image1.Canvas.MoveTo(X , Y);
          Image1.Canvas.LineTo(Image1.Width , Y);
        end;
        Color := Color + $010101;
      end;
    end;
      

  2.   

    to kiboisme
      选择Image我也考虑和试用了很多次。关键是画出的图形里还有缩放,画游标,Image多次画图等。好,我重新考虑直接用Canvas做下。其实以前也做过的。再试看看 ,谢谢了
    留下联系,可以请教你
    我的油箱:[email protected]
      

  3.   

    使用Canvas.MoveTo, LineTo不会慢,不知道你要多块。
      

  4.   

    不管你有多少数据,并不要全部画出来啊,只画界面显示出来的部分就要以了.双缓冲区的意思是,你先在内部的一个画板上画好,然后在显示的画板上一次贴出来.
    你内部创建一个TBitmap,大小就是显示器的大小就可以了,有了数据先在上面画好,
    然后在界面的画布上一次贴出来.
    http://blog.csdn.net/zyxip/article/details/1546379
    用双缓冲实现图形的移动 
      

  5.   

    不行就直接在屏幕缓冲区画吧,速度肯定比多重缓冲要快,毕竟少了缓冲区复制。但根本问题是你的缓冲区数据是如何组织的,我觉得有两种解决办法,一是根据可视范围的不同,组织不同的数据,削减数据量,再加入一个深度缓冲区,被覆盖的数据不绘制,这样有点类似d3d的处理方式,但牵扯很多算法,难度比较大。二是定义一个超大缓冲区作为后缓冲区,把所有数据在这个后缓冲区绘制好以后就不动了,屏幕缓冲区只是根据可视范围的不同复制这个缓冲区的不同部分,这样的弊端是要大内存,我理解photoshop应该就是这种处理方法。