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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Delphi如何在控件上获取光标位置?相关的知识,希望对你有一定的参考价值。

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

答案

您可以使用MouseMove事件:

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

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

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

如果在单击控件时想要光标位置,则使用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;

以上是关于Delphi如何在控件上获取光标位置?的主要内容,如果未能解决你的问题,请参考以下文章

Delphi中如何判断当前光标的位置

delphi 中运行后窗口会被人为的拉大或者缩小,问题是,如何获取变化后的窗口大小的值?

如何定位文件中的指定的一个位置(delphi)?

MFC如何获取控件在对话框上的位置坐标

请问如何在delphi from窗体内加网页

c# 动态获取当前屏幕中光标所在位置