单击控件时如何获取鼠标的坐标?

Art*_*hur 10 delphi mouse timage

在TImage的OnClick事件中,我想提取鼠标的x,y坐标.我更喜欢它们与图像有关,但与形式或窗口相关也同样好.

ska*_*adt 24

Mouse.CursorPos包含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;
Run Code Online (Sandbox Code Playgroud)


Kev*_*vin 6

正如其他人所说,您可以使用 Mouse.CursorPos 或 GetCursorPos 函数,但您也可以只处理 OnMouseDown 或 OnMouseUp 事件而不是 OnClick。通过这种方式,您可以将 X 和 Y 值作为事件处理程序的参数,而无需进行任何额外的函数调用。


Rob*_*edy 6

Mouse.CursorPos属性将告诉您鼠标的当前位置.如果计算机运行缓慢,或者程序响应消息的速度很慢,则可能与OnClick事件首次发生时鼠标的位置不同.要在单击鼠标按钮时获取鼠标的位置,请使用GetMessagePos.它报告屏幕坐标 ; 转换为客户端坐标TImage.ScreenToClient.

另一种方法是处理OnMouseDownOnMouseUp事件的自己; 他们的参数包括坐标.请记住,两个事件都需要发生才能发生点击.您可能还想检测拖动操作,因为您可能不希望将拖动视为点击.