代码之家  ›  专栏  ›  技术社区  ›  Matt Warren

在MFC中检测单个鼠标单击

  •  5
  • Matt Warren  · 技术社区  · 16 年前

    在MFC中,双击鼠标事件会触发以下消息序列

    • 沃尔布顿镇
    • WM_LBUTTONUP

    因此,回应 WM_LBUTTONDBCLK

    但只要看看 WM_LBUTTONUP 消息是不够的,因为它可能是一次单击,也可能是双击的第一次单击。

    7 回复  |  直到 16 年前
        1
  •  11
  •   Serge Wautier    16 年前

    (请允许我将这些事件称为鼠标上升和鼠标下降。我的MFC有点生锈。还有一个叫做.NET的东西最近把我的术语弄乱了;-)

    短篇小说 :你不只是想知道鼠标点击。你需要更多。

    长话短说 :

    更进一步地讲,您不应该依赖于在处理鼠标下降后接收鼠标上升:用户可能已经移动了鼠标并在其他地方释放了按钮(想想拖放),在这种情况下,您不会收到鼠标上升事件。。。除非您在MouseDown上捕获鼠标,以确保即使鼠标离开您的窗口,您也能从mouse event up到mouse up。

    总之 :没有鼠标点击消息只是因为你不会走得太远:无论如何,你需要处理更多的消息并实现更多的机制。

        2
  •  1
  •   Heinrich Ulbricht    16 年前

    我刚刚在Delphi中尝试过这个,其行为是相同的:即使双击正在发生,也会在两个事件中的第一个之后发出一个单击事件。

    我用定时器解决了这个问题,它的工作原理如下:

    • bDbl true
    • 如果需要,激活WM_LBUTTONUP上的计时器 bDbl==false
    • 如果出现以下情况,禁用WM_LBUTTONUP bDbl==true (和重置 bDbl )

    我将计时器的间隔设置为 GetDoubleClickTime .

    MSDN说:

    GetDoubleClickTime函数 鼠标时间到了。双击即可 连续两次单击鼠标 第一次之后的指定时间。这个 可能发生的毫秒数 在第一次和第二次单击之间 双击。

        3
  •  0
  •   SmacL    16 年前

    您可以检查WM_LBUTTONDOWN在WM_LBUTTONUP之前没有被多次调用。在实践中,Windows为您做到了这一点,因为如果您得到一个WM_LBUTTONDBCLK,您往往不会得到WM_LBUTTONUP。

        4
  •  0
  •   mwigdahl    16 年前

    据我所知,没有办法知道这是正在发生的情况,这是有道理的——在时间到期之前,没有办法知道第二次点击是否会到来。

        5
  •  0
  •   cbrulak    16 年前

    这有点棘手。

    这可能意味着您需要运行另一个线程,但我认为您可以用一个线程来完成它。

        6
  •  0
  •   Arjun    16 年前

    我认为解决办法是在第一次单击后启动计时器&然后在下一次单击时检查经过的时间,这将告诉您是单击还是双击。

        7
  •  -2
  •   Aaron Fischer    16 年前

    推荐文章