var
pt : tPoint;
begin
pt := Mouse.CursorPos;
// now have SCREEN position
Label1.Caption := 'X = '+IntToStr(pt.x)+', Y = '+IntToStr(pt.y);
pt := Image1.ScreenToClient(pt);
// now have Image position
Label2.Caption := 'X = '+IntToStr(pt.x)+', Y = '+IntToStr(pt.y);
end;
5条答案
按热度按时间siotufzp1#
CursorPos包含TPoint,而TPoint又包含X和Y位置。这个值是全局坐标,因此您可以使用ScreenToClient例程将屏幕坐标转换为窗口坐标。
根据 Delphi 帮助文件,Windows.GetCursorPos可能会失败,Mouse.CursorPos将其 Package ,以在失败时引发EOsException。
注意:如果您省略了ScreenToClient方法的“Image1”,它将引用表单。
jtjikinw2#
Mouse.CursorPos
属性将告诉您鼠标的 * 当前 * 位置。如果计算机运行缓慢,或者您的程序对消息的响应缓慢,则它可能与第一次发生OnClick
事件时鼠标的位置不同。要获取鼠标单击时的位置 *,请使用GetMessagePos
。它报告 * 屏幕坐标 ;使用TImage.ScreenToClient
转换为客户端坐标。另一种方法是自己处理
OnMouseDown
和OnMouseUp
事件;它们的参数包括坐标。请记住, 两个 * 事件都需要发生,才能发生 * 单击 *。您可能还希望检测 * 拖动 * 操作,因为您可能不希望将拖动视为单击。5jdjgkvh3#
正如其他人所说,您可以使用Mouse.CursorPos或GetCursorPos函数,但也可以只处理OnMouseDown或OnMouseUp事件,而不处理OnClick。通过这种方式,您可以将X和Y值作为事件处理程序的参数,而无需进行任何额外的函数调用。
ibps3vxo4#
这个怎么样?
在网上找到了这个,并保存在我的codesnippet数据库中:)
This page可能会解决你所有的问题,但是...似乎有从客户端到屏幕坐标和返回等的函数。
祝你好运!
qqrboqgw5#
至Firemonkey(FMX):