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

问题描述 投票:4回答:3

我想知道光标在TCustomControl上的位置。如何找到坐标?

delphi cursor delphi-7
3个回答
6
投票

您可以使用MouseMove事件:

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

13
投票

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

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

4
投票

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

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;

EDIT:

正如各种人所指出的那样,这对于鼠标按下事件来说毫无意义。然而,由于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;
© www.soinside.com 2019 - 2024. All rights reserved.