GMap 鼠标拖拽与单击冲突问题以及按下鼠标移动Marker

4 篇文章 0 订阅

GMap 鼠标拖拽与单击冲突问题以及按下鼠标移动Marker

好久没有写博客啦,之前写了三篇关于GMap的,还是想继续写下去,在之前的基础之上本篇博客就解决两个问题吧:

  1. 我们在使用鼠标拖拽地图时,拖拽完成后,抬起鼠标GMap控件会触发鼠标点击事件, 原本博主以为GMap会提供相应的接口去让我们禁止触发鼠标单击事件,但是博主貌似没有找到GMap有提供这个接口,所以这个只能是我们手动来完成了。

首先利用GMap加载地图,然后完成鼠标单击添加Marker功能,这一部分博主这里简单略过,不会的请参照之前的博客。

要解决这个问题,最主要的是要区别鼠标拖拽与鼠标单击之间的区别,经博主总结有两点:
1. 从鼠标按下到鼠标抬起持续的时间鼠标单击事件较鼠标拖拽短
2. 鼠标按下位置到鼠标抬起位置距离鼠标单击事件较鼠标拖拽短

这里可以利用这两点区别使鼠标拖拽与鼠标单击事件彻底区分开来.

首先我们需要添加GMap控件的事件响应,按照我们一贯的思维来讲这里应该要使用到三个鼠标事件: 鼠标按下,鼠标抬起,鼠标单击,但是熟悉windows机制的童鞋可能知道这三个事件执行先后顺序是鼠标按下,然后是鼠标单击,最后是鼠标抬起事件,如果以鼠标按下和鼠标抬起两个事件作为区别鼠标拖拽和鼠标单击的依据,早在鼠标抬起之前鼠标单击事件已经执行结束,所以在此时鼠标抬起事件将变得没有意义,博主采用的方式是在鼠标单击事件的响应函数中先完成应该在鼠标抬起事件中完成的部分,然后再执行鼠标点击事件的执行代码。

首先我们得添加GMap控件的鼠标按下:

this.gMapControl1.MouseDown += gMapControl1_MouseDown;

针对第一个区别我们需要申明变量:

        private DateTime timemousedown;
        private int timemillSecond = 200;
        bool isMouseDrag=false;

其中timemousedown用于在鼠标按下事件中记录鼠标按下的时间,timemillSecond用于作为鼠标按下和鼠标抬起时间的临界值。我这里设置的是200毫秒,意思是从鼠标按下到鼠标抬起的事件超过200就认为是在进行鼠标拖拽地图。

针对第二个区别我们需要申明变量:

        private int mousedistance = 30;
        private int mousepress_x = 0, mousepress_y = 0;

其中mousepress_x 和mousepress_y 用于记录当鼠标按下时鼠标在GMap控件上所处的坐标,mousedistance作为鼠标按下和鼠标抬起事件的临界值,也就是鼠标按下位置到鼠标抬起位置之间的距离大于这个值时,就认为是鼠标拖拽。

最后我们还需要一个变量最后表示当前是正在进行鼠标单击还是鼠标拖拽,我这里定义为:

bool isMouseDrag = false;

到这里我首先附上代码,首先在鼠标按下事件中应该添加的代码为:

            timemousedown = DateTime.Now;
            mousepress_x = e.X;
            mousepress_y = e.Y;

主要用于记录鼠标按下的时间和位置,

然后在鼠标单击事件中应该添加的代码为:

            if (timemousedown.AddMilliseconds(timemillSecond) > DateTime.Now)
            {
                isMouseDrag = false;
            }
            else {
                isMouseDrag = true;
            }

            int x_dis = (mousepress_x > e.X) ? mousepress_x - e.X : e.X - mousepress_x;
            int y_dis = (mousepress_y > e.Y) ? mousepress_y - e.Y : e.Y - mousepress_y;
            if (mousedistance < System.Math.Sqrt(x_dis * x_dis + y_dis * x_dis))
            {
                isMouseDrag = true;
            }
            if (!isMouseDrag) { 
                PointLatLng p = gMapControl1.FromLocalToLatLng(e.X, e.Y);
                GMapMarker marker = new GMarkerGoogle(p,GMarkerGoogleType.blue_dot);
                overlay.Markers.Add(marker);            
            }

根据代码可以很明确的看到博主之前说明两个区别,这里不做过多的解释。

  1. 如果我们在地图上点击鼠标添加Marker,如何利用鼠标移动已有的Maker.

首先在之前的基础之上需要实现GMap的鼠标抬起事件,鼠标进入Marker事件,鼠标离开Marker事件以及鼠标移动事件。


            this.gMapControl1.OnMarkerEnter += gMapControl1_OnMarkerEnter;
            this.gMapControl1.OnMarkerLeave += gMapControl1_OnMarkerLeave;
            this.gMapControl1.MouseMove += gMapControl1_MouseMove;
            this.gMapControl1.MouseUp += gMapControl1_MouseUp;

然后声明四个变量:

        bool isMouseDown = false;
        bool isMarkerEnter = false;
        bool isMarkerDrag = false;
        GMapMarker currentMarker;

其中isMouseDown用来记录当前鼠标是否按下,在鼠标按下事件中设置为true,在鼠标抬起事件中设置为false。isMarkerEnter用来记录当前鼠标是否处于Marker中,在鼠标进行入Maker事件中设置为true,在鼠标离开Marker事件中设置为false。isMarkerDrag用来表示当前是否在拖动Marker,currentMarker用于在鼠标进入Marker事件中记录下该Marker。以上所述的内容这里就不附加代码了。

最重要的部分在鼠标移动事件中:

            PointLatLng p = gMapControl1.FromLocalToLatLng(e.X, e.Y);
            if (isMarkerEnter && isMouseDown) {
                isMarkerDrag = true;
            }
            if (!isMouseDown) {
                isMarkerDrag = false;
            }
            if (isMarkerDrag)
            currentMarker.Position = p;

这里首先是判断鼠标是否在Marker显示区域内按下,即判断isMarkerEnter 和 isMouseDown是否同时为真,作为Marker拖动的确认条件,这一点相信大家都没有问题。而Marker拖拽的失效条件这里仅仅设置为鼠标抬起,即判断isMouseDown为false,这里是因为Marker本身在GMap上的定位造成的,假设我们在地图上点击一个点其坐标为: x,y 那么有一个Marker对应到这个点,这个点在Marker上的位置并不是Marker的正中心,而是Marker的正中心投影到最底边的位置,所以如果鼠标在Marker上按下,并且向下移动时,立马就会触发鼠标离开Marker事件,导致不能将Marker向下拖拽,所以这里只能使用鼠标抬起作为失效条件。

最后附上本次的代码:http://download.csdn.net/detail/yuanquanzheng/9670524

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值