我的代码: 
procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton; 
  Shift: TShiftState; X, Y: Integer); 
begin 
  drawing:=true; 
  if(drawing)then 
    begin 
      paintbox1.Canvas.Pen.Color:=clyellow; 
      if(x>=length(Y_Values))then 
        begin 
          paintbox1.Canvas.MoveTo(Max_Y_Values.x ,Max_Y_Values.y ); 
          paintbox1.Canvas.LineTo(x,y); 
          setlength(Y_Values,x); 
          Max_Y_Values.x:=x; 
          Max_Y_Values.y:=y; 
        end 
        else 
          begin 
          paintbox1.Canvas .moveto(x,Y_Values[x]); 
          paintbox1.Canvas .lineto(x,y);     end; 
end; 
procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X, 
  Y: Integer); 
begin 
  if ((X>=0) and (X <=512)) and ((Y>=0) and (Y <=350)) then 
    begin 
        label1.Caption :='X:'+inttostr(x)+'  Y:'+inttostr(y); 
      if drawing then 
        begin 
          Y_Values[x]:=y; 
          Timer1.Enabled :=true; 
        end; 
    end; 
end; 
procedure TForm1.PaintBox1MouseUp(Sender: TObject; Button: TMouseButton; 
  Shift: TShiftState; X, Y: Integer); 
begin 
  扫描屏幕,并得到整个屏幕的像素点,放在数组Y_Values[x]:=y 
end; 
procedure TForm1.Timer1Timer(Sender: TObject); 
var 
  i:word; 
begin 
  paintbox1.Refresh; 
  image1.Picture.Bitmap.LoadFromFile('1.bmp');//整个屏幕擦除 
  paintbox1.Canvas.MoveTo(Zero ,Y_Values[Zero] ); 
    for i:=1 to Max_Y_Values.x do 
      begin 
        paintbox1.Canvas.LineTo(i,Y_Values[i]); 
      end; 
end; 
问题:鼠标移动快,捕捉到的点太少,而且鼠标按下移动过程只能看到很闪的波形,等鼠标停下来的时候,只剩下一个被擦除了的屏幕,没有波形。请大家提提建议

解决方案 »

  1.   

    加双缓冲DoubleBuffered := True;重绘事件在onpaint中处理,不要用一个timer去控制
      

  2.   

    好的,试试先
    http://www.56.com/u65/v_NDUyNjk4OTQ.html这个是实现这个画图的例子
      

  3.   

    是的,加双缓存是必须的,否则比较闪烁,就是画的时候在内存位图里画,画好后把它 Bitblt到某个控件的HDC上
      

  4.   

    上面的两位:
       我对双缓冲不大熟悉,能不能给个例子。我邮箱[email protected]
      

  5.   

    LZ好多分啊  我不熟悉这一块  看看Delphi深度历险呢 里面有不少图形编程知识
      

  6.   

    楼主在这里也提出这个问题啊, 我在大富翁上有回答:
    基本的几点同这里的的几位大侠差不多:
    1. 不要timer;  //重点
    2. doublebuffered; //不是关键
    3. 使用memoryCanvas; // 重点;
    4. 使用矢量数据; //关键
      

  7.   

    to leisenpaw:
      谢谢,我先查查资料吧
      

  8.   

    搞一个够大的TPoint数组,记录当前的位置为-1
    down时将位置保存到数组中,记录位置为0
    move 时记录每个位置
    up 时记录最后的位置从数组中读取内容绘制,可以直接写在onpaint 事件中,在move,up的时候刷新。用双缓冲实现图形的移动 
    http://blog.csdn.net/ZyxIp/archive/2007/03/30/1546379.aspx
      

  9.   

    to ZyxIp:
      "move 时记录每个位置":这个方法你能做到吗,当鼠标移动快,是不能捕捉到每个位置的吧。
      

  10.   

    我的代码: 
    procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton; 
      Shift: TShiftState; X, Y: Integer); 
    begin 
      drawing:=true; 
      if(drawing)then 
        begin 
          paintbox1.Canvas.Pen.Color:=clyellow; 
          if(x>=length(Y_Values))then 
            begin 
              paintbox1.Canvas.MoveTo(Max_Y_Values.x ,Max_Y_Values.y ); 
              paintbox1.Canvas.LineTo(x,y); 
              setlength(Y_Values,x); 
              Max_Y_Values.x:=x; 
              Max_Y_Values.y:=y; 
            end 
            else 
              begin 
              paintbox1.Canvas .moveto(x,Y_Values[x]); 
              paintbox1.Canvas .lineto(x,y);     end; 
    end; 
    procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X, 
      Y: Integer); 
    begin 
      if ((X>=0) and (X <=512)) and ((Y>=0) and (Y <=350)) then 
        begin 
            label1.Caption :='X:'+inttostr(x)+'  Y:'+inttostr(y); 
          if drawing then 
            begin 
              Y_Values[x]:=y; 
              Timer1.Enabled :=true; 
            end; 
        end; 
    end; 
    procedure TForm1.PaintBox1MouseUp(Sender: TObject; Button: TMouseButton; 
      Shift: TShiftState; X, Y: Integer); 
    begin 
      扫描屏幕,并得到整个屏幕的像素点,放在数组Y_Values[x]:=y 
    end; 
    procedure TForm1.Timer1Timer(Sender: TObject); 
    var 
      i:word; 
    begin 
      paintbox1.Refresh; 
      image1.Picture.Bitmap.LoadFromFile('1.bmp');//整个屏幕擦除 
      paintbox1.Canvas.MoveTo(Zero ,Y_Values[Zero] ); 
        for i:=1 to Max_Y_Values.x do 
          begin 
            paintbox1.Canvas.LineTo(i,Y_Values[i]); 
          end; 
    end; 
    问题:鼠标移动快,捕捉到的点太少,而且鼠标按下移动过程只能看到很闪的波形,等鼠标停下来的时候,只剩下一个被擦除了的屏幕,没有波形。请大家提提建议  重要:请结合下面的视频看我的问题!    http://www.56.com/u65/v_NDUyNjk4OTQ.html这个是实现这个画图的视频
      

  11.   

    做了个小例子。
    http://download.csdn.net/source/1547308
      

  12.   

    先谢谢ZyxIp。
    不过,你的例子还不能解决问题。当鼠标往回走的时候,X轴上就不只一个Y值了。(我是用来发送波形数据的,X轴上有且只有一个Y值).这样的软件有人实现过,就是下面的视频
    http://www.56.com/u65/v_NDUyNjk4OTQ.html
      

  13.   

    新的小例子,可以实现你的功能,但如果要是想让线显示的更漂亮,没有锯齿,你得调用GDI+的函数来绘制。http://download.csdn.net/source/1547511
      

  14.   

    佩服,就是有锯齿,GDI+查了一下资料还不是很懂,如果再发一个GDI+的就更好了:)。
      

  15.   

    网上查一下 万一 的博客,里面有很多使用GDI+的例子。
      

  16.   

    to  ZyxIp:
      我还有一个相同的帖子http://topic.csdn.net/u/20090802/23/9015c9bb-86cd-4394-b802-ec1d7c00b99e.html,差不多可以结帖子了:)
      

  17.   

    to  ZyxIp: 
       进http://topic.csdn.net/u/20090802/23/9015c9bb-86cd-4394-b802-ec1d7c00b99e.html这个帖子留个言,给你分,我要结帖了:)