另一个人们会问的问题是,”如何实现鼠标的三次点击或者更多次点击?”如果你读过关于双击的文章,并理解了其中所用到的算法,则将它扩展到三击也会十分自然。你需要做的第一件事是,将CS_DBLCLKS风格从类中移除,因为我们希望手动管理鼠标的点击。
接下来,你需要重新实现Windows窗口管理器所使用的相同算法,并实现鼠标三击而不是双击。让我们动手试试,将如下代码添加到例子程序中。
(请注意,我们的例子程序一开始就没有使用到CS_DBLCLKS风格,所以无需移除它)
我们的想法很简单:当一次鼠标点击发生时,我们检查它是否位于”双击区域”且在双击时间范围之内。如果不是,则我们重置鼠标点击计数值。
(请注意,SM_CXDOUBLECLK和SM_CYDOUBLECLK值是整个矩形的宽度,因此我们在扩展矩形时将其切成两半,以便矩形向任一方向延伸一半。是的,这意味着如果双击宽度为奇数,则像素会丢失,但Windows一直小心地将值设置为偶数。)
接下来,我们记录当前点击的坐标和时间,以便下次点击时可以与它进行比较。
最后,我们通过在标题栏中放置连续的点击编号来对点击做出反应。
这段代码有一些微妙之处。首先,请注意将g_cClicks设置为零会强制将下一次点击视为系列中的第一次点击,因为无论它是否符合其他条件,都会发生点击计数增加到1。
接下来,请注意我们测试点击是否发生在双击时间内的方式对计时器刻度翻转不敏感。如果我们这样写代码的话:
那么我们将无法在计时器刻度翻转附近正确检测到多次点击。(这段请仔细理解,确保能理解。)
第三,注意我们在窗口获得或失去激活时重置点击计数。这样,如果用户单击,然后切换离开,然后切换回来,然后再次单击,则不会被视为双击。如果用户在两者之间单击鼠标右键,我们也会这样做。(你可能会注意到,很少有程序会如此精妙。)
练习:假设你的程序只处理鼠标的三次点击,如何像窗口管理器那样在鼠标双击时停止?
总结
双击已经太累,就不要三击了吧?