AE中的OnMouseDown与OnDoubleClick响应判断

本文介绍如何在MapControl中区分单击与双击事件,并通过.NET中的System.Timers.Timer来延迟判断单击事件,确保正确触发双击操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求

  • 在当前的Command或者Tool下单击或者双击mapcontrol进行不同的响应;
  • 单击添加元素;
  • 双击判断是否有元素被选中

分析

  • 很明显核心的实现就是如何判断出当前是单击还是双击!

补充说明

  1. 在AE中存在两个响应双击的事件,一个是控件MapControl中的OnDoubleClick,就是进行过微软DX包装过的,还有一个就是原生的继承自ITool接口的OnDblClick;虽然都是双击,前者有参数,而后者没有参数,根据需求与设计自己选择;这里我们选择前者,因为击位置需要根据参数判断。
  2. 在MapControl中如果同时存在OnMouseDown与OnDoubleClick事件的话,那么即使双击也一定会先进入到OnMouseDown事件中,然后再进入OnDoubleClick事件,然后结束不会再次进入到OnMouseDown事件。

实现

既然需要判断单击还是双击且一定会进入单击,那么我们就需要给单击添加一个控制,当他进入单击了以后延后响应操作,等一会看看有没有双击操作发生,所以OnMouseDown需要一个时间控制器;

System.Timers.Timer timerClose = new System.Timers.Timer(500);//延后时间500ms
timerClose.Elapsed += timerClose_Elapsed;//延后时间到了之后执行的操作
timerClose.AutoReset = false;//只执行一次
timerClose.SynchronizingObject = this;//设置同步对象,这个很重要,否则会出现线程问题
timerClose.Enabled = true;//开始计时

关于时间控制器其实.Net是不止一个,System.Timers.Timer主要就是服务于Winform的,当然也有服务于web的,大家自行搜索~

这里Elapsed 事件中就是注册我们在时间到了以后会执行的函数,且这个函数无论我们是否执行了双击都会执行;

但是没关系,因为我们只需要在双击事件的开始就对类的全局变量进行赋值操作,那么在Elapsed 注册事件中进行判断就可以不进行单击的下一步操作了,而双击操作也会继续进行下去~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值