小7的大店铺【淘宝店】 游戏引擎剖析-全篇 公积金相关帖子汇总 魅族M8SDK学习系列不断更新中

[魅族M8] M8SDK学习之说说单击和双击

[ 3403 查看 / 2 回复 ]

与几位M8网友聊到了处理单击和双击,这个东西不弄不知道,一弄就有问题了。原来单击和双击共存是有条件的。

1、单击
通常我们认为:点一下即完成了一次单击。这个过程说明了操作系统是如何完成鼠标操作的,当然在M8中指的是按了一下。为了说明单击我准备用windows在PC系统里的处理做为例子。

在使用鼠标在windows里操作时,用到比较多的就是左键。很多的指令都是通过它来发送的,哪这又是怎么样的一个过程呢?在与朋友聊这个话题的时候,谈到了VB和Delphi这类可视化开发工具里对控件中单击事件的处理。比如使用Delphi里建一个窗口,放一个按钮,此按钮的OnClick事件中会打开另一个窗口,在这个程序运行后,用鼠标点一下这个按钮,接着新窗口就打开了。在这整个过程中,Delphi的处理过程如下:

1、鼠标按下按钮,这时系统会产生一个WM_LBUTTONDOWN消息。
2、Delphi获取到这个消息并进行处理。
3、鼠标弹起,这时会产生另一个消息:WM_LBUTTONUP。
4、同样的Delphi进行了处理,只不过这时Delphi在处理WM_LBUTTONUP消息时,多做了点事情,调用 了一个Click方法。

看完这个过程也许就会明白了,其实点击就是按下、弹起。所以如果要专门处理点击,处理WM_LBUTTONUP消息即可。

有一个要注意的问题:当按下按钮后,将鼠标移动到别的地方再弹起鼠标,此时就不会打开新的窗口了,这是为什么呢?不是按下、弹起吗?这是因为在处理WM_LBUTTONUP消息时会检查当前弹起的坐标是否在按钮的区域,如果不在就不触发单击。

2、双击
在windows的控制面板里有个设置鼠标双击速度的程序,用过就会明白其实双击算的是两次点击的时间。如果时间内就发送一个双击消息。这么看来理解就简单了。上面的Delphi例子中,在窗口中可以创建一个双击事件,此事件做一件事情就是改变一下窗口的标题。也就是说当鼠标在窗口上双击之后窗口的标题就改变了。

双击的处理过程如下:
1、鼠标在窗口上双击,此时会产生一个WM_LBUTTONDBLCLICK消息
2、获取消息并处理之

这好像比单击处理起来直接明了,其实不然,光处理双击消息其实很简单的过程,而真正这个过程是经过了很多步骤的,真正的过程如下:
1、鼠标第一击按下,系统会产生一个WM_LBUTTONDOWN消息
2、获取到这个消息处理
3、鼠标第一击弹起,系统会生一个WM_LBUTTONUP消息
4、获取到这个消息处理(这时完成了一次点击,同样的会调用Click)
5、鼠标第二击按下,系统此时检查出时间间隔是一个双击的时间
6、系统发送一个双击消息
7、获取此双击消息并处理
8、鼠标第二击弹起,系统产生一个WM_LBUTTONUP消息
9、处理消息

这个过程是完成一次双击过程所产生的消息及处理。可以看出,双击时同样会有一次单击,就在第4步。而当双击消息发出后,系统不再发送WM_LBUTTONDOWN消息了,而只发出了一个WM_LBUTTONUP消息。


从上面对于单、双击的分析后,得出了一个结论,要同时处理单击和双击有时是不能共存的。不知道是不这样!至于本文所述都是以Delphi为范本的,但是对于M8而言,意思差不多。只是M8的消息定义有点不一样罢了,或者说名字不一样,如WM_LBUTTONDOWN,在M8SDK里是MZ_MN_LBUTTONDOWN。



作者:5207
出处:http://www.mini188.com
本文版权归作者所有,欢迎转载请注明出处,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
本主题由 皇帝 5207 于 2009-7-4 11:50:18 执行 主题分类 操作
分享 转发
相信与不相信都是矛盾的.  5207宣!
欢迎您来到迷你论坛
TOP

可否这样:
第一次BUTTONUP后,等待n毫秒,若同一控件没有在此期间再次发出BUTTONDOWN消息,则判断为单击,否则继续判断,如果接下去在同一控件上又出现BUTTONUP,即为双击。
TOP

回复 2# cool007zqw 的帖子

可以的。其实现在系统也是这么判断的吧。
相信与不相信都是矛盾的.  5207宣!
欢迎您来到迷你论坛
TOP