我想重写 OnMouseClick 和 OnMouseDoubleClick 并根据使用的单击样式执行不同的操作。

问题是单击和双击都会发生 OnMouseClick,并且在 OnMouseDoubleClick 之前被调用。

我确信这一定是一个常见的要求,所以我想我错过了一些非常明显的东西。有人可以帮我补一下吗?

编辑添加:MouseEventArgs.Clicks 计数没有帮助。在双击的情况下,第一次单击将在 OnMouseClick 中处理为单击,且 MouseEventArgs.Clicks == 1。

编辑添加:对象是图像缩略图。单击即可打开和关闭选择以进行导出。双击应该使缩略图全屏显示。选择和“激活”动作是正交的。这可能表明这两个操作存在根本问题......

欢呼,罗布

有帮助吗?

解决方案

这种情况在整个 Windows 中都会发生。我认为他们没有添加任何特殊的东西来在.Net 中处理它。

处理这个问题的正常方法是

  • a) 只需单击一下即可 你会想在双倍之前发生 单击,喜欢选择。
  • b) 如果这不是一个选项,则在单击事件上启动计时器。在计时器滴答时,执行单击操作。如果双击事件先发生,则终止计时器,然后执行双击操作。

您设置的时间量应等于系统的双击时间(用户可以在控制面板中指定)。它可以从 System.Windows.Forms.SystemInformation.DoubleClickTime 获得。完整的详细信息在 MSDN 中, 这里

其他提示

问题是大多数对象都没有实现这两个目标。对于单击和双击可以合理地具有不同动作的少数对象通常可以在双击动作之前运行单击动作(突出显示然后打开文件夹,在选择之前在地址栏上输入焦点等)。确定的方法可能是等待单击一段时间,如果检测到双击则取消单击的操作。

另一种可能的解决方案是让OnMouseDoubleClick函数调用OnMouseClick。由于OnMouseClick中的操作是二进制切换,因此调用它两次会将其重置为相同的状态。

因此,当用户双击时,Windows会调用OnMouseClick,然后调用OnMouseDoubleClick。 OnMouseDoubleClick调用OnMouseClick(再次)恢复状态,然后处理双击。

作为一种解决方案,这种感觉并不令人满意,但它确实有效。

使用计时器(吞下双击的第一次点击)同样不令人满意,并且处理用户的双击率首选项会增加复杂性。

干杯, 罗布

您可以在 OnMouseClick 事件处理程序中启动计时器。

  • 如果计时器超时(例如 300 毫秒),则需要单击一次。

别的

  • 如果在超时之前生成了另一个 OnMouseClick 事件,您可以检查单击的 x&y 位置,如果它在第一次单击的特定半径内,则执行双击功能。

否则

  • 处理第一次点击并重新初始化第二次点击的计时器

注意:这种实现的优点是,时间输入和“双击”半径都可以独立于系统配置进行配置,从而允许将软件导入到多台机器上/

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top