文章图片
文章图片
另一个人们会问的问题是 , ”如何实现鼠标的三次点击或者更多次点击?” 如果你读过上一篇关于双击的文章 , 并理解了其中所用到的算法 , 则将它扩展到三击也会十分自然 。 你需要做的第一件事是 , 将CS_DBLCLKS风格从类中移除 , 因为我们希望手动管理鼠标的点击 。
接下来 , 你需要重新实现Windows窗口管理器所使用的相同算法 , 并实现鼠标三击而不是双击 。 让我们动手试试 , 将如下代码添加到例子程序中 。
(请注意 , 我们的例子程序一开始就没有使用到CS_DBLCLKS风格 , 所以无需移除它)
我们的想法很简单:当一次鼠标点击发生时 , 我们检查它是否位于”双击区域”且在双击时间范围之内 。 如果不是 , 则我们重置鼠标点击计数值 。
(请注意 , SM_CXDOUBLECLK 和 SM_CYDOUBLECLK 值是整个矩形的宽度 , 因此我们在扩展矩形时将其切成两半 , 以便矩形向任一方向延伸一半 。是的 , 这意味着如果双击宽度为奇数 , 则像素会丢失 , 但 Windows 一直小心地将值设置为偶数 。 )
接下来 , 我们记录当前点击的坐标和时间 , 以便下次点击时可以与它进行比较 。
最后 , 我们通过在标题栏中放置连续的点击编号来对点击做出反应 。
这段代码有一些微妙之处 。首先 , 请注意将 g_cClicks 设置为零会强制将下一次点击视为系列中的第一次点击 , 因为无论它是否符合其他条件 , 都会发生点击计数增加到 1 。
接下来 , 请注意我们测试点击是否发生在双击时间内的方式对计时器刻度翻转不敏感 。 如果我们这样写代码的话:
那么我们将无法在计时器刻度翻转附近正确检测到多次点击 。(这段请仔细理解 , 确保能理解 。 )
第三 , 注意我们在窗口获得或失去激活时重置点击计数 。这样 , 如果用户单击 , 然后切换离开 , 然后切换回来 , 然后再次单击 , 则不会被视为双击 。如果用户在两者之间单击鼠标右键 , 我们也会这样做 。(你可能会注意到 , 很少有程序会如此精妙 。 )
练习:假设你的程序只处理鼠标的三次点击 , 如何像窗口管理器那样在鼠标双击时停止?
总结【鼠标|实现多次鼠标点击】双击已经太累 , 就不要三击了吧?
最后Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一 , 里面有很多关于Windows的小知识 , 对于广大Windows平台开发者来说 , 确实十分有帮助 。
本文来自:《Implementing higher-order clicks》
相关经验推荐
- 鼠标|电脑桌面怎样分屏显示?原来方法这么简单,可惜很多人都不知道
- 鼠标|外设黑话你懂吗?明白这些少走弯路
- vivo|从更好到最好,vivo如何在2021实现蜕变?
- 汽车|工信部:2022年对应用商店、第三方软件开发工具包等实现监管全覆盖
- Xbox|便携静音还能无线充电 雷柏新品M700三模鼠标
- 机器学习|?机器学习和人工智能的应用,在心脏病学的许多领域实现了更快的诊断
- 游戏鼠标|HyperX旋火无线游戏鼠标,摆脱“线”制,黑白双煞争分夺秒
- 芯片|华为海思之后,国产5G射频实现突破!外媒:余承东的话将兑现
- 安卓|新年换只手感更好的小鼠标,让手腕更清爽,工作娱乐更舒服
- 美团|美团或将首先实现L4自动驾驶