【问题标题】:How do I get the coordinates of the mouse when a control is clicked?单击控件时如何获取鼠标的坐标?
【发布时间】:2010-10-24 00:54:29
【问题描述】:

在 TImage 的 OnClick 事件中,我想提取鼠标的 x,y 坐标。我更喜欢它们与图像的关系,但与窗体或窗口的关系一样好。

【问题讨论】:

  • 这对于双击来说更加重要。

标签: delphi mouse timage


【解决方案1】:

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;

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 这个答案很明显ScreenToClient 是一个方法,而不仅仅是一个“例程”。如果在没有明确命名对象的情况下调用它,则该对象为self(主要是一些TForm)。在某些情况下,另一个对象更有意义,例如 这种情况。顺便说一句,你说的是 drag - 它不是在移动吗 (OnMouseMove)?
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      这个怎么样?

      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 可能会解决你所有的问题,但是......似乎有从客户端到屏幕坐标和返回等的功能。

      祝你好运!

      【讨论】:

        【解决方案5】:

        致火猴 (FMX):

        var
          p: TPointF;
        begin
          p := Screen.MousePos;
        end;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-02-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多