代码其实很简单,内容如下:
1、新建工程后分别在FormShow和MouseMove事件里添加如下代码:
procedure TForm1.FormShow(Sender: TObject);
begin
  FInfoLabel := TLabel.Create(Self);
  FInfoLabel.Parent := Self;
  FInfoLabel.Color := clInfoBK;
  FInfoLabel.Visible := False;
end;procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  Po :TPoint;
  procedure DrawHORZLine(x,y :integer);
  begin
    Canvas.MoveTo(x,0);
    Canvas.LineTo( x,self.Height);
    Canvas.MoveTo(0,Y);
    Canvas.LineTo( self.Width,Y);
  end;
begin
  GetCursorPos(Po);
  Po := ScreenToClient(Po);
  Canvas.Pen.Mode := pmNOTXOR;
  Canvas.Pen.Color := clBlack;
  if FOldFloatPo.Y > - 1 then
     DrawHorzLine(FOldFloatPo.X,FOldFloatPo.Y);
  FOldFloatPo := Po;
  DrawHorzLine(FOldFloatPo.X,FOldFloatPo.Y);
  FInfoLabel.Caption := '';
  FInfoLabel.Caption := 'X坐标:'+inttostr(FOldFloatPo.X) +' '+ 'Y坐标:'+inttostr(FOldFloatPo.Y);
  FInfoLabel.Width := 200;
  FInfoLabel.Left := FOldFloatPo.X + 5  ;//- round(FInfoLabel.Width/2);
  FInfoLabel.Top := FOldFloatPo.Y - 15 ;
  FInfoLabel.Visible := True;
  FInfoLabel.Refresh;
end;2、并在FORM类中添加如下对象
    FOldFloatPo :TPoint;
    FInfoLabel:TLabel;3、设置窗颜色最好为白色好了运行时后,迅速晃动鼠标,会出现很多拖尾现象,想问怎么解决。

解决方案 »

  1.   

    画图前需要擦除窗口区域
      procedure DrawHORZLine(x,y :integer);
      begin
        Canvas.FillRect(ClientRect);    //加这个
        Canvas.MoveTo(x,0);
        Canvas.LineTo( x,self.Height);
        Canvas.MoveTo(0,Y);
        Canvas.LineTo( self.Width,Y);
      end;
      

  2.   

    不行啊,我只是举了个例子,窗口区域如果还有其他的图形内容,这样清除的话不就都清除了,如果本来就是用这个十字坐标来绘图的,那不是绘出来什么就擦掉什么了。这样解决我认为不是最好的,我想解决的是为什么有拖尾。我个人认为可能是控件本身的缘故,用TLabel,TEdit,THintWindow都有这些现象。
      

  3.   

    那你应该把画图相关的操作都放到OnPaint中。
      

  4.   

    直接用窗体的Hint显示坐标行不行?
      

  5.   

    主要是那个label,会挡住部分图像。改了一下你的代码:procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
    Y: Integer);
    var
    Po :TPoint;  procedure DrawHORZLine(x,y :integer);
      var
        bm:TBitmap;
        Text:String;
      begin
        bm:=TBitmap.Create;
        try
          bm.Canvas.Brush.Color := 0;
          bm.Canvas.Font.Color := clWhite;
        Text:= 'X坐标:'+inttostr(FOldFloatPo.X) +' '+ 'Y坐标:'+inttostr(FOldFloatPo.Y);
          bm.Width :=bm.Canvas.TextWidth(Text);
          bm.Height := bm.Canvas.TextHeight(Text);      bm.Canvas.TextOut(0,0,Text);    Canvas.CopyMode:=cmSrcInvert;
        canvas.Draw(x+5,y-15,bm);    finally
          bm.free;
        end;  Canvas.MoveTo(x,0);
      Canvas.LineTo( x,self.Height);
      Canvas.MoveTo(0,Y);
      Canvas.LineTo( self.Width,Y);
      end;
    begin
      FInfoLabel.hide;
      GetCursorPos(Po);
      Po := ScreenToClient(Po);  Canvas.Pen.Mode := pmNOTXOR;
      Canvas.Pen.Color := clBlack;  if FOldFloatPo.Y > - 1 then
        DrawHorzLine(FOldFloatPo.X,FOldFloatPo.Y);  FOldFloatPo := Po;  DrawHorzLine(FOldFloatPo.X,FOldFloatPo.Y);
    {
      FInfoLabel.Caption := '';
      FInfoLabel.Caption := 'X坐标:'+inttostr(FOldFloatPo.X) +' '+ 'Y坐标:'+inttostr(FOldFloatPo.Y);
      FInfoLabel.Width := 200;
      FInfoLabel.Left := FOldFloatPo.X + 5 ;//- round(FInfoLabel.Width/2);
      FInfoLabel.Top := FOldFloatPo.Y - 15 ;
      FInfoLabel.Visible := True;
    //  FInfoLabel.Refresh;
      FInfoLabel.show;}
    end;
      

  6.   

    楼上办法不错,尽量简化MouseMove里的代码,把一些定义放外面。