鼠标双击响应的实现「建议收藏」

鼠标双击响应的实现「建议收藏」今天在实现鼠标双击响应的时候,遇到了一些问题,下面是对我很有帮助的解释:首先对鼠标双击事件原理做一个简单的了解:在Windows平台上,鼠标左键的按下、松开、快速的两次点击会产生WM_LBUTTONDOWN、WM_LBUTTONUP和WM_LBUTTONDBLCLK消息,但是Windows根据什么来区分连续的两次鼠标按键操作,是两次独立的单击,还是一次双击呢?最近在解决一个问题时,通过使用…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

今天在实现鼠标双击响应的时候,遇到了一些问题,下面是对我很有帮助的解释:

首先对鼠标双击事件原理做一个简单的了解:

在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捕获后续的鼠标消息,转发到别的窗口,导致原窗口不能识别双击,而这个双击可能正是期望的。

上面是对鼠标双击消息的实现原理 做的一个简单介绍

下面是实现的一个例子:

在鼠标左键按下函数内做判断(计算两次鼠标左键点击的时间),如果满足条件则调用,则响应鼠标双击消息WM_LBUTTONDBLCLK,对应的处理函数为OnLButtonDblClk()

代码如下:

double m_ClickInterval=0;
void CMFCOCCView::OnLButtonDown(UINT nFlags, CPoint point)
{
	SaveSelectObject();                 //此处是无关处理代码
	myXmin=point.x;  myYmin=point.y;
	myXmax=point.x;  myYmax=point.y;


	if(GetTickCount() - m_ClickInterval < GetDoubleClickTime())//鼠标双击时间
	{
		OnLButtonDblClk(nFlags, point);
		return;
	}

	m_ClickInterval = GetTickCount();        
}


void CMFCOCCView::OnLButtonDblClk(UINT nFlags, CPoint point)  //
{
	SwitchSelectFace();
}

简单的测试了一下效果,可以实现。

参考文章:http://blog.csdn.net/cnike/archive/2009/11/25/4870064.aspx

http://blog.sina.com.cn/s/blog_634a11720100oych.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/189520.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 如何彻底禁止易升更新Win10自动更新「建议收藏」

    如何彻底禁止易升更新Win10自动更新「建议收藏」Win10版本:家庭中文版64位版本1803[10.0.17134.285]]文章版本:v1.9最后修改日期:2019年5月11日正文第一步关闭系统更新服务下载WindowsUpdateBlockerv1.2,按照下图所示操作下载地址:点我第二步(禁止安装Windows易升):1打开C盘,在根目录下新建一个文件夹,将此文件夹重命名…

    2022年6月4日
  • python attrs_一直比较疑惑python中关于attrs的问题

    python attrs_一直比较疑惑python中关于attrs的问题今天看一个爬虫代码的时候遇到如下代码:links=getLinks(“/wiki/Python_(programming_language)”)print(links)while(len(links)>0):forlinkinlinks:print(“——————-“)historyIPs=getHistoryIPs(link.attrs[“href…

    2022年10月17日
  • 在 Python 中的常见的几种字符串替换操作

    在 Python 中的常见的几种字符串替换操作基于Python3.7.3中,主要的方法有替换子串:replace()替换多个不同的字符串:re.sub(),re.subn()用正则表达式替换:re.sub(),re.subn()根据位置来替换:slice()replace()方法比如,输入的字符串为’onetwoonetwoone’,第一个参数为替换前的参数,第二个为替换后的参数。默认会替换字符串中的所有符合条件的字…

    2022年6月3日
  • Spring Boot面试杀手锏————自动配置原理

    Spring Boot面试杀手锏————自动配置原理引言不论在工作中,亦或是求职面试,SpringBoot已经成为我们必知必会的技能项。除了某些老旧的政府项目或金融项目持有观望态度外,如今的各行各业都在飞速的拥抱这个已经不是很新的Spring启动框架。当然,作为SpringBoot的精髓,自动配置原理的工作过程往往只有在“面试”的时候才能用得上,但是如果在工作中你能够深入的理解SpringBoot的自动配置原理,将无往不利。Spr…

    2022年6月15日
  • 信息系统项目的范围管理论文_高级项目管理师论文

    信息系统项目的范围管理论文_高级项目管理师论文本人参加了2019年上半年信息系统项目管理师考试,目前已经通过。论文我压了2篇,但是都没有压中,考场看到题目差点吐血,还好后面按照自己的思路也顺利过关。这里和大家分享一下我的论文资料,大家可以参考。摘要20xx年x月,我作为项目经理参与了深圳市某上市公司的生产管理系统项目。该项目总投资300万人民币,建设工期为10个月,通过项目的建设,实现了该公司物料管理、库存管理、生产工单、生产计划、生产派…

    2022年9月16日
  • 软件架构学习小结

    软件架构学习小结

    2021年12月17日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号