在 TImage 的 OnClick 事件中,我想提取鼠标的 x,y 坐标。我更喜欢它们与图像的关系,但与形式或窗口的关系也一样好。
5 回答
Mouse.CursorPos 包含 TPoint,而 TPoint 又包含 X 和 Y 位置。该值在全局坐标中,因此您可以使用 ScreenToClient 例程将屏幕坐标转换为窗口坐标来转换为您的表单。
根据 Delphi 帮助文件,Windows.GetCursorPos 可能会失败,如果失败,Mouse.CursorPos 会包装它以引发 EOsException。
var
pt : tPoint;
begin
pt := Mouse.CursorPos;
// now have SCREEN position
Label1.Caption := 'X = '+IntToStr(pt.x)+', Y = '+IntToStr(pt.y);
pt := ScreenToClient(pt);
// now have FORM position
Label2.Caption := 'X = '+IntToStr(pt.x)+', Y = '+IntToStr(pt.y);
end;
该Mouse.CursorPos
属性将告诉您鼠标的当前位置。如果计算机运行缓慢,或者您的程序对消息的响应速度很慢,那么它可能与OnClick
事件第一次发生时鼠标所处的位置不同。要获取单击鼠标按钮时鼠标的位置,请使用GetMessagePos
. 它报告屏幕坐标;用 转换为客户坐标TImage.ScreenToClient
。
另一种方法是自己处理OnMouseDown
andOnMouseUp
事件;它们的参数包括坐标。请记住,这两个事件都需要发生才能发生点击。您可能还想检测拖动操作,因为您可能不想将拖动视为一次点击。
正如其他人所说,您可以使用 Mouse.CursorPos 或 GetCursorPos 函数,但您也可以只处理 OnMouseDown 或 OnMouseUp 事件而不是 OnClick。通过这种方式,您可以将 X 和 Y 值作为事件处理程序的参数,而无需进行任何额外的函数调用。
这个怎么样?
procedure TForm1.Button1Click(Sender: TObject);
var
MausPos: TPoint;
begin
GetCursorPos(MausPos);
label1.Caption := IntToStr(MausPos.x);
label2.Caption := IntToStr(MausPos.y);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
SetCursorPos(600, 600);
end;
曾经在某处在线找到此内容并将其保存在我的代码片段数据库中:)
然而,这个页面可能会解决你所有的问题......似乎有从客户端到屏幕坐标和返回等的功能。
祝你好运!
至火猴 (FMX):
var
p: TPointF;
begin
p := Screen.MousePos;
end;