【问题标题】:Obtain Position/Button of mouse click on DoubleClick event在 DoubleClick 事件上获取鼠标点击的位置/按钮
【发布时间】:2012-02-18 13:29:36
【问题描述】:

在控件DoubleClick事件中有没有获取鼠标光标(x,y)坐标的方法?

据我所知,位置必须从全局获得:

Windows.Forms.Cursor.Position.X、Windows.Forms.Cursor.Position.Y

另外,有没有办法获取哪个按钮产生了双击?

【问题讨论】:

    标签: .net winforms double-click


    【解决方案1】:

    使用 MouseDoubleClick 事件而不是 DoubleClick 事件。 MouseDoubleClick 提供 MouseEventArgs 而不是普通的 EventArgs。这适用于“MouseClick”而不是“Click”......以及所有其他处理鼠标的事件。

    MouseDoubleClick 确保鼠标确实在那里。 DoubleClick 可能是由其他原因引起的,鼠标坐标可能没有用 - MSDN: “DoubleClick 事件在逻辑上是控件的更高级别事件。它们可能由其他用户操作引发,例如快捷键组合。”

    【讨论】:

      【解决方案2】:

      注意:正如 danbruc 指出的,这不适用于 UserControl,因为 e 不是 MouseEventArgs。另请注意,并非所有控件都会给您一个 DoubleClick 事件 - 例如,一个 Button 只会给您发送两个 Click 事件。

        private void Form1_DoubleClick(object sender, EventArgs e)
         {
             MouseEventArgs me = e as MouseEventArgs;
      
             MouseButtons buttonPushed = me.Button;
             int xPos = me.X;
             int yPos = me.Y;
         }
      

      获取相对于表单的 x,y..

      MouseEventArgs 中也有左键或右键。

      【讨论】:

      • 哦,是的......只是忘记了最简单的事情......:D
      • Ohhhh no ... me 将是 null,因为事件参数不是 MouseEventArgs,所以它不起作用。
      • @danbruc - 呃,我只是试了一下确定……它对我有用吗?也许我只是闭嘴吧!
      • 我只是为 UserControl 尝试了它,但它不起作用;为空。可能是某些控件实际上将 MouseEventArgs 传递给处理程序,但您不应依赖它,至少进行非空检查,未来版本可能会破坏此行为。它适用于哪些控件?
      • 我错过了“控件的双击”...我是在表单上做的。我将对此进行编辑以反映我的错误。感谢您的提醒。
      【解决方案3】:

      Control.MousePosition 和 Control.MouseButtons 正是您所寻找的。使用 Control.PointToClient() 和 Control.PointToScreen() 在屏幕和控件的相对坐标之间进行转换。

      有关详细信息,请参阅 MSDN Control.MouseButtons PropertyControl.MousePosition PropertyControl.PointToClient MethodControl.PointToScreen Method


      更新

      只见树木不见森林... :D 请参阅Moose's 答案并查看事件参数。

      这个MSDN article 列出了哪些鼠标操作会根据控件触发哪些事件。

      更新

      我错过了 Moose 的演员阵容,所以这不起作用。您必须使用 Control.DoubleClick() 内部的静态控件属性。由于按钮信息被编码为位字段,因此您必须使用所需的按钮进行如下测试。

      (Control.MouseButtons & MouseButtons.Left) == MouseButtons.Left
      

      【讨论】:

      • 如何确定使用 Control.MouseButtons 按下了哪个按钮?它包含要比较的常量,但除此之外我不知道如何使用它。双击事件参数不包含与之比较的变量。
      • danbruc,感谢您的提醒!我已编辑我的帖子以反映您的信息。
      • 你的答案更好:Compact Framework 中没有 MouseDoubleClick 事件,但你的方法很好。
      猜你喜欢
      • 1970-01-01
      • 2019-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 2022-01-15
      相关资源
      最近更新 更多