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)
您可以使用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)
如果您想要单击控件时的光标位置,则使用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)
| 归档时间: |
|
| 查看次数: |
32393 次 |
| 最近记录: |