如题,在鼠标移动快时,如何能捕捉到连续的点?

解决方案 »

  1.   

    to  anthony634:
    DirectInput是不是delphiX控件,缓冲模式是不是在delphiX里面设置的?能不能说的再具体点
      

  2.   

    钩 WM_MOUSEHOVER 消息应该可以的 
      

  3.   

    大家好,我要实现的功能是这样的:
    1,在图上画一个任意波形,然后把波形转换为波形数据,波形数组为Y_Values[x];=y;(x,y为捕捉到的TPoint类型);
    2,如果我不能捕捉到连续的移动事件x,y值,那我就得不到波形数组了!
    3,现在的问题是:我鼠标移动快了的话,确实捕捉不到连续的x,y值,我单步调试过了。  再加分,期待高手们出手相助~~
      

  4.   


    记得当年586电脑刚刚盛行时,有位高手在486平台下写了个游戏,还挺不错,唯一的缺点就是在586电脑上运行时动作过快。所以那位游戏的作者就建议大家玩这个游戏时,先打开word、photoshop之类的软件,让电脑运行能慢一点,然后再游戏。呵呵,居然这个也是方法
      

  5.   

    用GDI+中的 TGpGraphics 的 DrawLines(const pen: TGpPen; const points: array of TGpPointF)方法来画线,就是连续的
    当然如果是在画布上叠图,是会断点,我在做旋转画笔时也遇到这个问题....
      

  6.   


    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ExtCtrls,Gdiplus,GDIPUTIL;type
      TForm1 = class(TForm)
        btn1: TButton;
        img1: TImage;
        procedure FormCreate(Sender: TObject);
        procedure img1MouseDown(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
        procedure img1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
        procedure img1MouseUp(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
        procedure FormDestroy(Sender: TObject);
      private
        { Private declarations }
      public
        pGd : TGpGraphics;{ Public declarations }
        aPen : TGpPen;
        aPoint : array of TGpPoint;
        ox,oy : Integer;
        aCount : Integer;
        FMouseDown : Boolean;
        aBmp : TBitmap;
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
    begin
      pGd := TGpGraphics.Create(img1.Canvas.Handle);
      aPen := TGpPen.Create(ARGBFromTColor(clBlue),10);
      aPen.LineJoin := LineJoinRound;
      aPen.StartCap :=  lcRound;
      aPen.EndCap := lcRound;
    end;procedure TForm1.FormDestroy(Sender: TObject);
    begin
      pGd.Free;
      aPen.Free;
    end;procedure TForm1.img1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      FMouseDown := True;
      SetLength(aPoint,1);
      ox := x;oy := y;
      aPoint[0].X := X; aPoint[0].Y := Y;
    end;procedure TForm1.img1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
      if not FMouseDown  then Exit;  SetLength(aPoint,Length(aPoint) + 1);
      aPoint[Length(aPoint) - 1].X := X;
      aPoint[Length(aPoint) - 1].Y := Y;
      if Length(aPoint) = 1 then Exit;
      pGd.DrawLines(aPen,aPoint);
      img1.Repaint;
    end;procedure TForm1.img1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      FMouseDown := False;
    end;end.
      

  7.   

    注意,IMG1上加载了一副图片,否则画笔无法显示
      

  8.   

    TO:mdejtod
    不知道你用的那个版本的GDIPlus
    我在csdn上下一个 是王锐改版的那个 但好像和你的代码对应不上去啊
      

  9.   

    执行到这一句时报内存错误
    pGd.DrawLines(aPen,aPoint);
    我的是delphi2007,跟进去也没看出所以然来……
      

  10.   

    GDI+版本是可能不一样,我用的也是D2007
    你可发看看你自己的GDI+源代码,照着改一下就可以了,版本的不同也就是修改的人用不同的方法封装和调用了相同的DLL
      

  11.   


    你好,现在我没解决的问题是:鼠标移动快了的话,不能连续取像素点数组Y_Values[x];=y;但画线还是可以连续的。我的画线代码在下面:
    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
          paintbox1.Canvas.MoveTo(lastdot.X ,lastdot.Y );
          paintbox1.Canvas.LineTo(x,y);//以上两句为画线,画线是连续的
          lastdot:=point(x,y);
          Y_Values[x]:=y;//存的像素点数组,但不是连续的
         end;
       end;代码贴出来了,请大家看看。end;
      

  12.   

    to linyuzhi:
    现在数据可以取到了,谢谢;
    不过,还有一个问题,就是在画了波形之后,想擦除原来波形但擦除不了。我的部分主要代码如下:
    procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
          if drawing then
            begin
              paintbox1.Canvas .pen.Mode:=pmnotxor;
              paintbox1.Canvas.MoveTo(move_current.X ,move_current.Y );
              paintbox1.Canvas.LineTo(move_Y_Values.x,move_Y_Values.y);
              move_current:=point(x,y);//当前鼠标的位置x,y轴
              move_Y_Values:=point(x,Y_Values[x]);//Y_Values[x]为波形的Y轴
              paintbox1.Canvas.MoveTo(move_current.X ,move_current.Y );
              paintbox1.Canvas.LineTo(move_Y_Values.x,move_Y_Values.y);
            end;
         end;
    end;
    //我的本意:是想通过移动画线,一个像素一个像素擦除;
    //但是:我移动画线后,波形没能擦除;
    //帖子加分:)
      

  13.   

    to sanguomi:
    贴图片方法这个比较简单,就是不知道怎样擦除?
    感谢回复!
      

  14.   

    有没有人知道的,愿望献上所有的分:)我用moveto(x1,y1)和lineto(x2,y2)画了一个近似正弦波,现在遇到一个问题:怎样擦除波形呢?
    在网上查了一下资料,有人说用重画,于是我自己写了一段代码如下:
    procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
              paintbox1.Canvas .pen.Mode:=pmnotxor;
              paintbox1.Canvas .moveto(x,Y_Values[x]);//Y_Values[x]函数是波形X轴对应的Y值
              paintbox1.Canvas .lineto(x+1,Y_Values[x+1]);
    end;
    以上我的意思是通过一个像素点一个像素点擦除的(即重画),但是,当我鼠标移动快的话,波形有些点就擦除不干净了,原因我想就是鼠标移动太快捕捉不到波形上的点,请问这个问题如何解决?
      

  15.   

    你可以在 
    paintbox的mousemove之前先清除画布
    比如在mouseDOWN的时候 
    paintbox.canvas.brush.color := clwhite;
    paintbox.canvas.fillrect(paintbox.canvas.cliprect);
      

  16.   

    Windows不会给你这么详细的消息,你就人命了吧。
    擦除就是不把被擦除的部分画上去,其他部分都画就成了。