【发布时间】:2010-10-24 00:54:29
【问题描述】:
在 TImage 的 OnClick 事件中,我想提取鼠标的 x,y 坐标。我更喜欢它们与图像的关系,但与窗体或窗口的关系一样好。
【问题讨论】:
-
这对于双击来说更加重要。
在 TImage 的 OnClick 事件中,我想提取鼠标的 x,y 坐标。我更喜欢它们与图像的关系,但与窗体或窗口的关系一样好。
【问题讨论】:
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 和OnMouseUp 事件;它们的参数包括坐标。请记住,both 事件需要发生才能使 click 发生。您可能还想检测 拖动 操作,因为您可能不希望将拖动视为一次点击。
【讨论】:
ScreenToClient 是一个方法,而不仅仅是一个“例程”。如果在没有明确命名对象的情况下调用它,则该对象为self(主要是一些TForm)。在某些情况下,另一个对象更有意义,例如 这种情况。顺便说一句,你说的是 drag - 它不是在移动吗 (OnMouseMove)?
正如其他人所说,您可以使用 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;
曾经在某个地方在网上找到过这个并将其保存在我的 coden-p DB 中:)
This page 可能会解决你所有的问题,但是......似乎有从客户端到屏幕坐标和返回等的功能。
祝你好运!
【讨论】:
致火猴 (FMX):
var
p: TPointF;
begin
p := Screen.MousePos;
end;
【讨论】: