查看: 3998|回复: 13

双击事件怎么才可以避免触发单击事件啊?

[复制链接]

该用户从未签到

发表于 2009-3-5 17:26:06 | 显示全部楼层 |阅读模式
如题:
我做一个沿着地形起伏划线的程序。
左键单击取点,超出一个点取点同时画线。左键双击结束。
可是双击的同时会触发左键单击事件,从而使得最终多取一个点,多画一条线,
分析,暂时认为这一步逻辑上不知道该怎么避免。
开始想过多取点后,最后再做一些撤销工作,可是最终得到的一些数据也需要做撤销之类的。感觉比较麻烦,代码也比较混乱了。
有没有可以直接避免触发单击时间的方法呢?

switch(ea.getEventType())
{
case(osgGA::GUIEventAdapter:USH):       
{
if( ea.getButtonMask() == osgGA::GUIEventAdapter:EFT_MOUSE_BUTTON )
                        {
                                ... ...
                        }
return false;
}
case(osgGA::GUIEventAdapter:OUBLECLICK ):
{
   ... ...
}

该用户从未签到

 楼主| 发表于 2009-3-5 17:32:21 | 显示全部楼层
在这个类class MeasureHandler :: public GUIEventHandler
的 virtual bool handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& aa);
这个函数里进行处理的。

该用户从未签到

发表于 2009-3-5 19:33:27 | 显示全部楼层
应该不会有您说的问题?因为底层的GraphicsContext是分开处理PUSH和DOUBELCLICK事件的,不会重复
您再看一看,晚上我也会抽时间尝试一下。

该用户从未签到

 楼主| 发表于 2009-3-6 11:13:42 | 显示全部楼层
谢谢阿锐了。
我在网上查的时候,有人给出一些答案。
说可以用两次单击的时间相减得到的时间间隔来判断单击还是双击。
问题是,这样判断出来后,不应该发生的单击事件已经发生了。又得转过头来做撤销工作。

OSG,目前我认为是存在这个问题。我先再单独写个小程序来测试一下单击和双击的问题。

该用户从未签到

 楼主| 发表于 2009-3-6 13:58:18 | 显示全部楼层
跟踪调试的时候也没什么办法哦。总会进到单击事件里去。
水平还很限啊。

该用户从未签到

发表于 2009-3-6 14:26:58 | 显示全部楼层
我查了一下MSDN,事实上Win32 SDK开发时的双击动作本身就会触发四个连续的事件:
WM_LBUTTONDOWN,WM_LBUTTONUP,WM_LBUTTONDBLCLK,WM_LBUTTONUP
因此OSG也会产生这样的效果,并非是错误或者BUG。

解决方法还是得自己进行判断才行,或者您可以痛斥M$~~~~

该用户从未签到

 楼主| 发表于 2009-3-6 18:17:56 | 显示全部楼层
我再 想想办法。还是得多学点东西。 谢谢阿锐。

该用户从未签到

发表于 2009-3-6 18:24:32 | 显示全部楼层
这个地方你可以用一个定时器,,根据两次点击的时间来选择相应的事件响应~~~~

该用户从未签到

发表于 2009-3-7 22:49:15 | 显示全部楼层
判断2次单击之间的时间差就好了

该用户从未签到

 楼主| 发表于 2009-3-9 10:45:40 | 显示全部楼层

回复 8楼 的帖子

我在四楼已经说过这个方法了。可是无法解决。

因为假如按照这种方法判断出是双击事件时,不应该发生的单击事件已经发生了。又得转过头来做撤销工作。

该用户从未签到

发表于 2009-3-9 10:59:06 | 显示全部楼层
就是不管是单击和是双击都要有这个时间限制 就是说在一定时间内 如果2次单击事件就是双击 只有一次就是单击 然后在执行单击或者是双击后的操作

该用户从未签到

 楼主| 发表于 2009-3-9 14:01:41 | 显示全部楼层

回复 11楼 的帖子

因为我的是个在地形上画图的程序,所以实时性要求很高。
根据你们的方法,我先判断出来是单击还是双击,也就是要经过一个DoubleClickTime的时间之后我才能判断出来,同样我要在这个时间之后,才能够执行自己的绘制操作。
这样就降低了自己的实时性了。
各位还有什么好的办法没有呢?
目前,我是做了些撤销工作。也就是在双击的时候把多执行的一步单击操作所绘制的线段给撤销掉。由于我做了一个橡皮筋效果(鼠标移动时会跟随鼠标绘制一条移动的线),所以目前这样执行撤销的时候看不出来我做过撤销。

该用户从未签到

发表于 2009-3-9 14:26:37 | 显示全部楼层
为什么非要双击结束画线呢,反正M$已经这样了……点击右键结束或者回车结束不可以吗~~

该用户从未签到

 楼主| 发表于 2009-3-9 14:58:56 | 显示全部楼层

回复 13楼 的帖子

呵呵。对哦。不应该按照死规定来哦。
也没必要钻牛角尖。
把帖子结了。谢谢大家了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表