最近画图费神,数据量大,delphi能画图的控件都使用过.chart画图吃内存;paintbox画图容易擦除.改用image画图,内存是解决了,就是画图时,数据多那速度实在太慢了?有朋友提出自己写个TGraphiControl继承控件来画图,可以解决.摸索了几天了,框架都搞懂了,就是不知道咋个写这个控件?
画图的要求很简单,把所有数据点描在image上就可以了.
使用过双缓冲,效果不好,速度没有什么提高.

解决方案 »

  1.   

    chart不吃内存啊 是不是什么地方没弄好啊
      

  2.   

    根据DELPHI的版本安装相应的控件包使用控件即可
      

  3.   

    谢谢各位。我要画图的数据最大考虑1G吧。数据以ASCII码形式用TXT文本格式保存在磁盘上。
    用chart控件做实时图形只显示当前数据在屏幕上,不要求显示的就清除,就不怎么占内存,如果按照我们的要求,把所有数据都显示在chart上,会占内存的。
    留QQ的同仁,我已经加你了。谢谢
      

  4.   

    procedure TWinControl.WMPaint(var Message: TWMPaint);
    var
     DC, MemDC: HDC;
     MemBitmap, OldBitmap: HBITMAP;
     PS: TPaintStruct;
    begin
     if not FDoubleBuffered or (Message.DC <> 0) then
     begin
        if not (csCustomPaint in ControlState) and (ControlCount = 0) then
          inherited
        else
          PaintHandler(Message);
     end
     else
     begin
        DC := GetDC(0);
        MemBitmap := CreateCompatibleBitmap(DC, ClientRect.Right, ClientRect.Bottom);
        ReleaseDC(0, DC);
        MemDC := CreateCompatibleDC(0);
        OldBitmap := SelectObject(MemDC, MemBitmap);
        try
          DC := BeginPaint(Handle, PS);
          Perform(WM_ERASEBKGND, MemDC, MemDC);
          Message.DC := MemDC;
          WMPaint(Message);
          Message.DC := 0;
          //把图形绘制在MemDc上????
          BitBlt(DC, 0, 0, ClientRect.Right, ClientRect.Bottom, MemDC, 0, 0, SRCCOPY);
          EndPaint(Handle, PS);
        finally
          SelectObject(MemDC, OldBitmap);
          DeleteDC(MemDC);
          DeleteObject(MemBitmap);
        end;
     end;
    end;
    想问一下???的地方怎么绘制图形,moveto()和lineto()根本调不出来呀
      

  5.   

    什么意思?不懂就问很正常吗?我还以为谁给我解决问题了呢?你懂不懂delphi?我怀疑,因为Delphi的控件有些是有弊端的。
      

  6.   

    DC := GetDC(0);
      MemBitmap := CreateCompatibleBitmap(DC, ClientRect.Right, ClientRect.Bottom);
      ReleaseDC(0, DC);
      MemDC := CreateCompatibleDC(0);
      OldBitmap := SelectObject(MemDC, MemBitmap);
      try
      DC := BeginPaint(Handle, PS);
      Perform(WM_ERASEBKGND, MemDC, MemDC);
      Message.DC := MemDC;
      WMPaint(Message);
      Message.DC := 0;
      //把图形绘制在MemDc上????
      BitBlt(DC, 0, 0, ClientRect.Right, ClientRect.Bottom, MemDC, 0, 0, SRCCOPY);
      EndPaint(Handle, PS);
      finally
      SelectObject(MemDC, OldBitmap);
      DeleteDC(MemDC);
      DeleteObject(MemBitmap);
      end;
     end;
    各位有人知道,怎么在MenDC(句柄)上画图吗?我希望有人能知道。非常感谢了问:liehu1
    xyline控件是什么控件,第三方控件吗??
      

  7.   

    遇得到!!
    请懂这方面的兄弟姐妹回答吧。谢谢了  DC := GetDC(0);
      MemBitmap := CreateCompatibleBitmap(DC, ClientRect.Right, ClientRect.Bottom);
      ReleaseDC(0, DC);
      MemDC := CreateCompatibleDC(0);
      OldBitmap := SelectObject(MemDC, MemBitmap);
      try
         DC := message.DC;
        //怎么在这里把图绘制在MemDC上???
         BitBlt(DC, 0, 0, ClientRect.Right, ClientRect.Bottom, MemDC, 0, 0, SRCCOPY);
      finally
        SelectObject(MemDC, OldBitmap);
        DeleteDC(MemDC);
        DeleteObject(MemBitmap);
      end;
     end;
      

  8.   

    不好意思,我以为是DELPHI做饼图呢,看错了
      

  9.   

    蛋疼,你的数据如果都在内存中,占内存是必然的!你有多少就占据多少!这个与绘图没关系的,你绘图,显示在屏幕上的东西并不占多少内存,也并不耗多少时间资源,毕竟,你仅仅是绘制线条之类的东西而已!所以你要防止占内存,首先你应该考虑如何对显示的数据进行内存管理!既开辟足够大的两端缓存,一段用来显示当前数据,一段用来预存下一段显示数据,当你显示下一段数据的时候,再翻转,预存另一段你要绘制的数据,这样,就可以将内存控制在固定的范围之内!画图实际上问题不大!看楼主说的,Chart,自己绘制都实现了,说明应该绘图不是主要问题了!
      

  10.   

    Image用于画图,速度很慢。。看来女人还是有很大优势,我以前问这些问题时就没人答过。
      

  11.   

    谢谢了。我自己解决了。直接调用windows库函数。
    完整代码公布给大家吧:相互学习
      DC := GetDC(0);
      MemBitmap := CreateCompatibleBitmap(DC, ClientRect.Right, ClientRect.Bottom);
      ReleaseDC(0, DC);
      MemDC := CreateCompatibleDC(0);
      TPEN:=createpen(MemDC,ps_solid);//可以自己查一下设置画笔
      OldBitmap := SelectObject(MemDC, MemBitmap);
      try
       dc:=message.DC;
       movetoEX(MemDC,0,0,nil);
       for i:=0 to 20000 do
         LineTo(MemDC,i,random(1000));
       BitBlt(DC, 0, 0, ClientRect.Right, ClientRect.Bottom, MemDC, 0, 0, SRCCOPY);
      finally
      SelectObject(MemDC, OldBitmap);
      DeleteDC(MemDC);
      Deleteobject(Tpen);
      DeleteObject(MemBitmap);
      end;
     end;
      

  12.   


    QQ已经加你了,可没看见你上来过。希望得到帮助,交流一下编程思想。谢谢你了;
    ,单独说QQ联系吧。