菜鸟想实现  在某控件上画图(信息量较大),能够实现放大缩小(可以让用户自由选择区域),并能够保存图片。请问选中哪种控件效率最高,各有何优劣。Timage ? TpainBox?   TBitImage?
另:在TpainBox  Onpain中    with pb1.Canvas do
    begin      Brush.Color := clRed;
      //Pen.Style:=psClear;
      Rectangle(0,0,10,100);      Pen.Width :=10;
      Pen.Color := clBlack;
      //Pen.Style := psSolid;
      Brush.Style:=bsclear;//取消填充色
      MoveTo(20,0);
      LineTo(20,100);
    end;可以明显地看到 ,上段代码 那两句注释以后,第二次onpaint时有问题,红色的部分会变黑,宽度也向右变大了,请问错误原因。

解决方案 »

  1.   

    宽度变大了是因为你有一个moveto,相当于你把笔移到了某处但是没有还原
    红色变黑也是同理Pen.Color := clBlack;颜色没还原
    至于哪种效率高?他们实现的功能都有区别把,哪个顺手那个效率就高
    TImage,可通过Picture属性加载显示图片
    TPaintbox,提供一个画布(Canvas)
    TBitImage 是改良版的 TImage
      

  2.   

    谢谢 funxu的回答1.当不停地再 pen  brush切换时,如何还原
    2.我要实现“在某控件上画图(信息量较大),能够实现放大缩小(可以让用户自由选择区域),并能够保存图片”,求推荐一个最高效的控件
      

  3.   

    所谓的还原就是当你的pen MoveTo(20,0),用完后要记得再MoveTo(0,0);当你的颜色设为黑色后要记得再改回红色,明白了?
      

  4.   

    菜鸟來接分,高效的控件就是TImage
      

  5.   

    with pb1.Canvas do
        begin      Brush.Color := clRed;   //这里是软件默认的画笔宽度为1
          //Pen.Style:=psClear;
          Rectangle(0,0,10,100);      Pen.Width :=10;         //这里设置了画笔宽度是10
          Pen.Color := clBlack;   //画笔颜色变成黑色
          //Pen.Style := psSolid;
          Brush.Style:=bsclear;//取消填充色
          MoveTo(20,0);
          LineTo(20,100);
        end;这个是最基本的控件操作。作为编程人员你一定要清楚了解其属性、方法。
    至于你要用什么控件画图,个人觉得使用Timage控件好一些,毕竟有操作功能,比如放大缩小等。
    你谈到信息量大,那么可以建议你使用双缓冲绘图。
    基本代码如:
    procedure form1.button1click(..)
    var
      DC,MemDC:HDC;
      MemBitmap,OldBitmap:HBitmap;
      tpen:Hpen;
      i:integer;
    begin
      DC := GetDC(0);
      MemBitmap := CreateCompatibleBitmap(DC, ClientRect.Right, ClientRect.Bottom);
      ReleaseDC(0, DC);
      MemDC := CreateCompatibleDC(0);
      TPEN:=createpen(PS_SOLID,1,RGB(120,255,230));//设置画笔
      SelectObject(MemDC,tpen);
      OldBitmap := SelectObject(MemDC, MemBitmap);
      try
      movetoEX(MemDC,0,0,nil);
      for i:=0 to 20000 do
        LineTo(MemDC,i,random(1000));
      BitBlt(image1.canvas.handle, 0, 0, ClientRect.Right, ClientRect.Bottom, MemDC, 0, 0, SRCCOPY);
      finally
      SelectObject(MemDC, OldBitmap);
      DeleteDC(MemDC);
      Deleteobject(Tpen);
      DeleteObject(MemBitmap);
      end;
     end;希望对你有帮助!
      

  6.   


    谢谢您的耐心解答。
    您提供的代码,用图形DC句柄这种方式画图,我在MFC里画过一点。为什么delphi中不直接用canvas呢,是不是效率相差很大?
      

  7.   

    用图形DC句柄这种方式画图,我在MFC里画过一点。为什么delphi中不直接用canvas呢,是不是效率相差很大?
      

  8.   

    不知我的这个是不是你想要的
    http://topic.csdn.net/u/20120419/13/d7084181-79cb-41cd-bb10-8effca70927c.html
    是的话,关注我的QQ,我传个实例给你
      

  9.   

    就用TIMAGE吧,能够保存,放大缩小(strechBlt).
    效率肯定是CDC快,应为CANVAS是对CDC的封装