【问题标题】:How to catch coordinates of mouse cursor (IDE Delphi) to invoke Context Menu如何捕获鼠标光标的坐标(IDE Delphi)以调用上下文菜单
【发布时间】:2022-01-20 16:02:19
【问题描述】:

当我调用上下文菜单创建新控件时,如何捕捉鼠标光标的坐标(IDE Delphi)?

我想通过上下文菜单在调用上下文菜单的相同坐标处创建一个新控件。

我正在创建自己的组件编辑器来执行此操作,然后我需要鼠标的坐标来在那里创建控件。

【问题讨论】:

  • @TomBrunberg 第二句话清楚地说明了当您将“新组件”与“新控件”交换时。我可以想象类似“在我刚刚右键单击的位置向此表单添加新的编辑控件”。
  • 目前的答案似乎都没有考虑idetoolsapi 标签。
  • 我正在创建一个 ComponentEditor 表单来创建/配置一个新控件。我需要知道鼠标坐标,就像 IDE 的默认上下文菜单一样,才能在该位置创建控件。

标签: delphi ide components contextmenu toolsapi


【解决方案1】:

我不知道我是否理解你的问题,但是有一些方法可以捕捉到你的鼠标位置:

方法 1 - 捕捉屏幕上的鼠标位置: 在这里你可以像这样使用TMouse 类:

var
  m: TMouse;
begin
  lbl_cordinate_screen.Caption := format('Mouse cordinate on screen: x:%d, y:%d', 
                                          [m.CursorPos.X, m.CursorPos.y]);
end;

方法 2 - 捕获控件上的鼠标位置: 在这里您可以使用GetCursorPos,我声明了一个名为cursorCordinate 的函数,它将接收一个控件名称(我使用名为frm_main 的表单作为给定控件,但它可以是任何其他控件,如按钮、标签或其他任何东西) 并且它将返回一个TPoint 值,其中包含鼠标在给定控件上的位置:

//function to capture mouse position on a control
function cursorCordinate(myCtrl: TWinControl): TPoint;
var
  mouse_p: TPoint;
begin
  GetCursorPos(mouse_p);
  ScreenToClient(myCtrl.Handle, mouse_p );
  result := mouse_p;
end;

用法示例:

begin
  lbl_cordinate_form_1.Caption := format('Mouse cordinate on form: x:%d, y:%d',  
                                          [cursorCordinate(frm_main).X, cursorCordinate(frm_main).y]);
end;

方法 3 - 在控件上捕获鼠标位置的另一种方法: 在这里您可以使用控件的OnMouseMove 事件及其XY 参数,只需将您的代码块放在该事件中即可。我用它在我的表单 (frm_main) 上的标签 (lbl_cordinate_form_2) 中显示鼠标位置,但您可以使用任何其他控件的 OnMouseMove 事件:

procedure Tfrm_main.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
lbl_cordinate_form_2.Caption := format('Mouse cordinate on form: x:%d, y:%d', [x, y]);
end;

您可以在图像中看到结果;第一行是方法1的结果,第二行是方法2的结果,第三行是方法3的结果:

【讨论】:

    【解决方案2】:

    通过将此代码添加到FormContextPopup可以获得鼠标位置

       uses FMX.Forms;
       ...
       ...
     procedure TForm88.FormContextPopup(Sender: TObject; MousePos: TPoint;
          var Handled: Boolean);
        begin
          Label1.Caption:=FMX.Forms.Screen.MousePos.X.ToString+' 
               '+FMX.Forms.Screen.MousePos.Y.ToString;
        
        end;
    

    【讨论】:

      猜你喜欢
      • 2011-08-30
      • 2013-07-14
      • 2012-09-26
      • 2023-03-30
      • 1970-01-01
      • 2021-02-10
      • 2014-02-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多