9

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

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

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

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

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

干杯,罗伯

4

4 回答 4

13

这在整个 Windows 中都会发生。我不认为他们在.Net 中添加了任何特别的东西来处理它。

处理这个的正常方法是

  • a) 只需单击您希望在双击之前发生的事情,例如选择。
  • b)如果这不是一个选项,那么在点击事件上,启动一个计时器。在计时器滴答声中,执行单击操作。如果先发生双击事件,则终止计时器,然后执行双击动作。

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

于 2008-10-20T14:09:07.033 回答
0

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

于 2008-10-20T14:11:07.777 回答
0

Another possible solution is to have the OnMouseDoubleClick function call OnMouseClick. Since the action in OnMouseClick is a binary toggle, calling it twice resets it to the same state.

So when the user double clicks, windows calls OnMouseClick, then OnMouseDoubleClick. OnMouseDoubleClick calls OnMouseClick (again) to restore the state, then handles the double click.

This feels unsatisfying as a solution, but it works.

Using a timer (to swallow the first click of the double click) is equally unsatisfying, and has the added complication of handling user's double click rate preferences.

Cheers, Rob

于 2008-10-20T14:27:41.893 回答
-1

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

  • If the timer times out (say 300ms) then a single click is intended.

Else

  • If another OnMouseClick event was generated before the time times out you could examine the x&y position of the click and if its within a particular radius of the first click then action the double click functionality.

Otherwise

  • Handle first click and re-initialise timer for second click

NB: This implementation has the advantage of the fact that both the timeoput and the 'double-click' radius can be configured independantly of the system configuration allowing the s/w to be imported onto multiple machines/

于 2008-10-20T14:13:25.137 回答