查看: 1670|回复: 5

【已解决】osg中的单击事件应该怎么弄。

[复制链接]

该用户从未签到

发表于 2013-5-25 16:06:00 | 显示全部楼层 |阅读模式
本帖最后由 lglgaigogo 于 2013-5-25 16:15 编辑

1. osg中不知道为什么没有单击事,我只好用PUSH事件代替了。
2. 一开始没有什么问题,后来我又使用了DRAG事件。
3.  问题来了,拖拽的时候,PUSH中的代码也执行了。

各位有没有知道怎么弄。

我的办法是:
设一个变量 bClick=false;

PUSH事件中:
bClick = true;

RELEASE事件中:
if(bClick==true)
   执行代码;

DRAG事件中:
bClick=false;

该用户从未签到

发表于 2013-5-25 18:30:29 | 显示全部楼层
怎么没有单击了?

该用户从未签到

 楼主| 发表于 2013-5-27 10:16:19 | 显示全部楼层
liuzhiyu123 发表于 2013-5-25 18:30
怎么没有单击了?

是哪个呀?


NONE        
PUSH        
RELEASE        
DOUBLECLICK        
DRAG        
MOVE        
KEYDOWN        
KEYUP        
FRAME        
RESIZE        
SCROLL        
PEN_PRESSURE        
PEN_ORIENTATION        
PEN_PROXIMITY_ENTER        
PEN_PROXIMITY_LEAVE        
CLOSE_WINDOW        
QUIT_APPLICATION        
USER

这里面没有吧。

该用户从未签到

发表于 2013-5-27 10:17:40 | 显示全部楼层
PUSH

该用户从未签到

发表于 2013-5-30 20:44:23 | 显示全部楼层
反复点击时,Windows鼠标事件的执行顺序总是:PUSH,RELEASE,PUSH,DBCLICK。。。所以通常在RELEASE的时候判断单击就可以

该用户从未签到

发表于 2013-5-31 08:45:30 | 显示全部楼层
原来问的是这个,看看这个就知道了

在Windows平台上,鼠标左键的按下、松开、快速的两次点击会产生WM_LBUTTONDOWN、WM_LBUTTONUP和 WM_LBUTTONDBLCLK消息,但是Windows根据什么来区分连续的两次鼠标按键操作,是两次独立的单击,还是一次双击呢?最近在解决一个问 题时,通过使用Spy++和查阅MSDN,弄清楚了这个问题。简单总结如下:     Windows根据两个条件来做这个区分: (1)双击的时间间隔     这是很容易想到的。更准确的说法是这样的,两次单击会产生四个鼠标点击消息,如果第三个消息(第二次按下)和第二个消息(第一次弹起引发的 WM_LBUTTONUP)间隔短于指定值,则把第三个消息处理成WM_LBUTTONDBLCLK消息;第四个消息照旧,WM_LBUTTONUP。 这个指定的时间间隔,在Windows XP SP2上缺省是0.5秒,其他操作系统可能相同。通过::GetDoubleClickTime调用可以得到这个值。 这个值是可以设置的。有两种方法设置这个值: ::SetDoubleClickTime调用,或者以SPI_SETDOUBLECLICKTIME为第一个参数调 用::SystemParametersInfo。设置的结果对系统中其他的应用程序也起作用。 (2)两次鼠标击点的空间距离     在第一次点击时,Windows以击点为中心,检测一个矩形区域,如果第二次点击不落在这个区域内,那就不把第三个消息算作 WM_LBUTTONDBLCLK消息。 这个矩形区域的缺省大小,在Windows XP SP2上缺省是4pt×4pt。可以以SM_CXDOUBLECLK或SM_CYDOUBLECLK为参数调用::GetSystemMetrics得 到。 这个值也是可以设置的。设置的方法是通过SPI_SETDOUBLECLKWIDTH或SPI_SETDOUBLECLKHEIGHT为第一个参数来调 用::SystemParametersInfo。设置的结果对系统中其他的应用程序也起作用。
因此,连续两次按下和弹起鼠标左键:
如果不符合以上两个条件,产生的消息是: WM_LBUTTONDOWN WM_LBUTTONUP WM_LBUTTONDOWN WM_LBUTTONUP
如果符合以上两个条件,产生的消息则是: WM_LBUTTONDOWN WM_LBUTTONUP WM_LBUTTONDBLCLK WM_LBUTTONUP
以上结论还隐含两个要点: (1)不管是算作两次连续的单击,还是一次双击,第一、二和四个消息都是不受影响的。在接受到一个双击消息之前,应用程序总是会先收到一个 WM_LBUTTONDOWN和一个WM_LBUTTONUP消息,之后是WM_LBUTTONUP消息。应用程序应该对各种消息做出恰当的处理; (2)第二个消息和第三个消息是关键,必须被连续发到同一个窗口过程才能被处理。开发中常见的一个错误是这样的:在处理第一个消息 WM_LBUTTONDOWN或者WM_LBUTTONUP时,通过SetCapture捕获后续的鼠标消息,转发到别的窗口,导致原窗口不能识别双击, 而这个双击可能正是期望的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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