我想知道光标在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;
正如各种人所指出的那样,这对于鼠标按下事件来说毫无意义。然而,由于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;