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

鼠标双击响应的实现「建议收藏」今天在实现鼠标双击响应的时候,遇到了一些问题,下面是对我很有帮助的解释:首先对鼠标双击事件原理做一个简单的了解:在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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 常见排序算法的稳定性「建议收藏」

    快速排序、希尔排序、堆排序、直接选择排序不是稳定的排序算法,而基数排序、冒泡排序、直接插入排序、折半插入排序、归并排序是稳定的排序算法首先,排序算法的稳定性大家应该都知道,通俗地讲就是能保证排序前2个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同。在简单形式化一下,如果Ai = Aj, Ai原来在位置前,排序后Ai还是要在Aj位置前。其次,说一下稳定性的好处。排序

  • 自定义web接收推送_Java Web

    自定义web接收推送_Java Webhttps://www.webjars.org/提供了很多js的jar,但是有时候有些js没有,我们也想打成jar,那怎么办?我们以jquery3.4.1版本为例子开始1.创建如下结构pom文件内容如下:<?xmlversion=”1.0″encoding=”UTF-8″?><projectxmlns=”http://maven.apache….

    2022年10月28日
  • Idea配置SVN教程

    Idea配置SVN教程第一步:下载svn的客户端,通俗一点来说就是小乌龟啦!去电脑管理的软件管理里面可以直接下载,方便迅速下载之后直接安装就好了,但是要注意这里的这个文件也要安装上,默认是不安装的,如果不安装,svn中的bin目录下就会没有svn.exe,这个待会会用到,所以一点要注意哦。(都是坑啊)如果你不幸没点第二个,别着急,本文章末尾给你解决办法然后就下一步下一步就安装好了。配置svn的环境变量在此就…

  • springBoot入门简介,使用spring initializer快速创建spring Boot项目

    springBoot入门简介,使用spring initializer快速创建spring Boot项目springBoot入门简介,使用spring initializer快速创建spring Boot项目

  • VDbench 参数信息[通俗易懂]

    VDbench 参数信息[通俗易懂]HD:主机定义 如果您希望展示当前主机,则设置hd=localhost。如果希望指定一个远程主机,hd=label。 system=IP地址或网络名称。 clients=用于模拟服务器的正在运行的客户端数量。 SD:存储定义 sd=标识存储的名称。 host=存储所在的主机的ID。 lun=原始磁盘、磁带或文件系统的名称。vdbench也可为您创建一个磁盘。 threads=对SD的最大并发I/O请求数量。默认

  • mysql导出数据库

    mysql导出数据库mysql命令行导出数据库mysqldump进行数据库导出备份命令行提示“拒绝访问”

发表回复

您的电子邮箱地址不会被公开。

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