Delphi如何在控件上获取光标位置?

Lit*_*per 4 delphi cursor delphi-7

我想知道光标在TCustomControl上的位置.

spl*_*ash 13

如果您无法处理鼠标事件,GetCursorPos会很有帮助:

function GetCursorPosForControl(AControl: TWinControl): TPoint;
var 
  P: TPoint; 
begin
  Windows.GetCursorPos(P);
  Windows.ScreenToClient(AControl.Handle, P );
  result := P;
end;
Run Code Online (Sandbox Code Playgroud)

  • 当TPoint实例位于> 2MB的内存地址时,FWIW,GetCursorPos在64位XP/Vista上无法正常工作.MS在Windows 7中修复了这个问题.我自己总是使用GetCursorInfo来回避这个bug. (8认同)

The*_*rse 6

您可以使用MouseMove事件:

procedure TCustomControl.MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  Label1.Caption := IntToStr(x) + ' ' + IntToStr(y);       
end;
Run Code Online (Sandbox Code Playgroud)

  • @Robrok,如果你是*编写*控件,那么你不应该使用`OnMouseMove`.这是控件的*用户*.*控件的Writer*应该覆盖`MouseMove`方法,如此处所示. (2认同)

Ger*_*oll 5

如果您想要单击控件时的光标位置,则使用Mouse.CursorPos获取鼠标位置,并将Control.ScreenToClient其转换为相对于控件的位置。

procedure TForm1.Memo1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  pt: TPoint;
begin
  pt := Mouse.CursorPos;
  pt := Memo1.ScreenToClient(pt);
  Memo1.Lines.Add(Format('x=%d, y=%d', [pt.X, pt.y]));
end;
Run Code Online (Sandbox Code Playgroud)

编辑:

正如很多人指出的那样,这对于鼠标按下事件来说是毫无意义的。然而,由于TCustomControl.OnMouseDown受到保护,它可能并不总是可以在第三方控件上轻松使用 - 请注意,我可能不会使用具有此类缺陷的控件。

一个更好的例子可能是 OnDblClick 事件,其中没有给出坐标信息:

procedure TForm1.DodgyControl1DblClick(Sender: TObject);
var
  pt: TPoint;
begin
  pt := Mouse.CursorPos;
  pt := DodgyControl1.ScreenToClient(pt);
  Memo1.Lines.Add(Format('x=%d, y=%d', [pt.X, pt.y]));
end;
Run Code Online (Sandbox Code Playgroud)

  • 您可以获取相对于控件的 X 和 Y 坐标作为事件处理程序的参数。从 `Mouse.CursorPos` 获取坐标并将其转换为“控制坐标”的代码是多余的! (4认同)