【发布时间】:2011-07-11 08:56:18
【问题描述】:
我想知道光标在 TCustomControl 上的位置。如何找到坐标?
【问题讨论】:
标签: delphi delphi-7 mouse-cursor
我想知道光标在 TCustomControl 上的位置。如何找到坐标?
【问题讨论】:
标签: delphi delphi-7 mouse-cursor
如果您无法处理鼠标事件,GetCursorPos 会很有帮助:
function GetCursorPosForControl(AControl: TWinControl): TPoint;
var
P: TPoint;
begin
Windows.GetCursorPos(P);
Windows.ScreenToClient(AControl.Handle, P );
result := P;
end;
【讨论】:
你可以使用 MouseMove 事件:
procedure TCustomControl.MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
Label1.Caption := IntToStr(x) + ' ' + IntToStr(y);
end;
【讨论】:
OnMouseMove Delphi 风格的事件处理程序并完成它时,为什么要直接处理WM_MOUSEMOVE?如果坚持使用WM_MOUSEMOVE,坐标在msg.Lparam,根据the documentation
ShowMessage去掉,换成Label1.Caption := X Y,因为设置Caption是非模态的,可以把鼠标移到控件上看看它更新。 ShowMessage 是模态的,只要鼠标悬停在控件上,消息就会弹出,并且在您单击“确定”之前不会发生任何其他事情
OnMouseMove。这适用于控件的用户。控件的编写者应覆盖MouseMove 方法,如此处所示。
如果您想要鼠标点击控件时的光标位置,则使用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;
正如许多人所指出的,这对鼠标按下事件毫无意义。然而,由于 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;
【讨论】:
Mouse.CursorPos 获取坐标并将其转换为“控制坐标”的代码是多余的!
"If you want the cursor position when they click on the control, then use Mouse.CursorPos to get the mouse position, and Control.ScreenToClient to convert this to the position relative to the Control.":我不同意。如果您需要知道用户点击的位置,请使用 received X 和 Y 坐标。