解决左键单击和双击有冲突的问题
来源:互联网 发布:pdf合并软件绿色版 编辑:程序博客网 时间:2024/04/30 13:25
遇到这样一个问题:
我想要给ListView中的Item增加几个消息响应:左单击时产生一个popupMemu,左双击时执行一个function1,右单击时执行function2。消息响应函数都写好后,发现程序在能产生弹出菜单的区域里,只能响应单击的消息响应;只有在不产生弹出菜单的区域里才会有双击消息的响应。
于是查看MSDN,有这样一些内容:
Double-clicking the left mouse button actually generates fourevents: WM_LBUTTONDOWN, WM_LBUTTONUP messages, the WM_LBUTTONDBLCLKcall, and another WM_LBUTTONUP message when the button isreleased.
分析原因,我做了这样一个猜想:左键单击产生弹出菜单,这个动作也许会向系统发送一个消息,这个消息夹在了鼠标两次单击的动作之间,使得系统认为我的双击动作是两次单击,所以无法响应双击的消息。
解决办法如下:在鼠标单击Item到产生出一个弹出菜单之间加入一个时间延迟,让系统有足够的时间来响应双击消息即可。
我马上用spy++来验证我的想法,结果是错误的。系统判断鼠标是否是双击,取决于鼠标按键两次按下的时间间隔,而无论中间是否夹杂了其他的消息,也就是说,我刚才的双击动作也产生了WM_LBUTTONDBLCLK消息;但是为什么我的消息响应函数没有被调用???
昨天一直在思考左键单击和双击有冲突的问题,今天终于有了解决方案:
在WM_LBUTTONDOWN的响应函数里加入以下代码,
clock_t start;
MSG msg;
start = clock();
while(clock()<start+0.15*CLOCKS_PER_SEC)
{
if(PeekMessage(&msg,this->m_hWnd,WM_LBUTTONDBLCLK,WM_LBUTTONDBLCLK,PM_NOREMOVE))
{
PostMessage(WM_COMMAND,IDR_SEND);
return;
}
else
continue;
}
代码的含义是,构造一个150ms的时间延迟循环,在这个循环体中不断偷窥(peek)消息,如果发现有WM_LBUTTONDBLCLK,就执行菜单命令(IDR_SEND);否则就结束循环,弹出左键的快捷菜单。
代码不算正规,不过确实得到了预期的效果。
Trackback:http://tb.blog.csdn.net/TrackBack.aspx?PostId=825820
- 解决左键单击和双击有冲突的问题
- 托盘左键单击和双击问题
- 鼠标左键单击双击冲突的一种解决方法
- 单击 双击冲突解决
- js鼠标单击和双击事件冲突问题的解决方法
- js鼠标单击和双击事件冲突问题的解决方法
- js鼠标单击和双击事件冲突问题的解决方法
- 解决鼠标左键单击冲突的问题(防止冒泡)
- 单击和双击事件的冲突处理
- 单击和双击事件的冲突处理
- MFC中由左键单击模拟左键双击引起的问题
- iOS 关于UITapGestureRecognizer 单击与双击手势冲突的解决
- 【jQuery】jQuery双击事件与单击事件的冲突解决
- iOS 单击手势和双击手势冲突问题
- VC鼠标单击与双击的冲突问题
- javascript解决鼠标单击双击冲突方法
- 双击和单击事件冲突解决方法
- fedora 16 下笔记本触摸板不能单击和双击问题的解决
- Web.config详解
- LPVOID(转)
- 开通博客了,
- Java用poi读取Word文档
- 回忆在google面试的经历
- 解决左键单击和双击有冲突的问题
- MyEclipse+Jboss下的EJB开发(EJB 2.x)
- 渲染到纹理(Render To Texture, RTT)详解
- C#中的委托和事件--转自张子阳
- eeee
- windows架设SVN服务器及在Visual Studio 2008使用ANKHSVN插件的进行代码管理
- DataGrade中ItemEditor属性使用说明
- 开源大旗谁来擎?
- OpenVG学习