鼠标中键(滚轮)和axMapControl之间的交互

ArcMap中对地图的浏览里,鼠标中键是一个非常重要的交互方式。它默认上滚缩小,下滚放大(与CAD相反,导致很多人不习惯),中键按下时可以对map进行平移操作。

在使用AE开发时,也希望实现类似的功能,同时,需要重载滚轮的功能,保证上滚放大,下滚缩小。

在参考(实现mapControl的滚轮缩放反效果)后,实现代码如下:

 public partial class MainFrame : Form
    {
        IEnvelope mEnvelope = null;
        IPoint mPoint = new PointClass();//缩放中心点
        IPoint mousePoint = null;//鼠标点击点
        IPoint startPnt = new PointClass();

        public MainFrame()
        {
            InitializeComponent();
            panel1.MouseWheel += new MouseEventHandler(panel1_MouseWheel);     
            
            axMapControl1.AutoMouseWheel = false;    //禁止axMapControl使用滚轮
            mEnvelope = axMapControl1.ActiveView.Extent;
            mPoint.X = (mEnvelope.XMax + mEnvelope.XMin) / 2;
            mPoint.Y = (mEnvelope.YMax + mEnvelope.YMin) / 2;
        }

        
        void panel1_MouseWheel(object sender, MouseEventArgs e)
        {
            mousePoint = axMapControl1.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(e.X, e.Y);
            double moveDisX = mousePoint.X - (mEnvelope.XMax + mEnvelope.XMin) / 2;
            double moveDisY = mousePoint.Y - (mEnvelope.YMax + mEnvelope.YMin) / 2;
            mEnvelope.CenterAt(mousePoint);
            if (e.Delta > 0)
            {
                mEnvelope.Width = mEnvelope.Width * 0.8;
                mEnvelope.Height = mEnvelope.Height * 0.8;
                mPoint.X = mousePoint.X - moveDisX * 0.8;
                mPoint.Y = mousePoint.Y - moveDisY * 0.8;
            }
            else if (e.Delta < 0)
            {
                mEnvelope.Width = mEnvelope.Width * 1.25;
                mEnvelope.Height = mEnvelope.Height * 1.25;
                mPoint.X = mousePoint.X - moveDisX * 1.2;
                mPoint.Y = mousePoint.Y - moveDisY * 1.2;
            }

            mEnvelope.CenterAt(mPoint);
            axMapControl1.ActiveView.Extent = mEnvelope;
            axMapControl1.ActiveView.Refresh();
        }

        private void axMapControl1_OnMouseDown(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnMouseDownEvent e)
        {        
                if (e.button == 4)
                {//中键按下时,记住按下点的位置
                   
                    startPnt.X = axMapControl1.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(e.x, e.y).X;
                    startPnt.Y = axMapControl1.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(e.x, e.y).Y;
                    mEnvelope = axMapControl1.ActiveView.Extent;
                    mPoint.X = (mEnvelope.XMax + mEnvelope.XMin) / 2;
                    mPoint.Y = (mEnvelope.YMax + mEnvelope.YMin) / 2;                  
                }          
        }

        private void axMapControl1_OnMouseMove(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnMouseMoveEvent e)
        {
            if(e.button==4)
            {
                //鼠标中键按下且拖动时         
                this.Cursor = System.Windows.Forms.Cursors.SizeAll;
                mousePoint = axMapControl1.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(e.x, e.y);
                double moveDisX = mousePoint.X - startPnt.X;
                double moveDisY = mousePoint.Y - startPnt.Y;
                
                mPoint.X = mPoint.X - moveDisX;
                mPoint.Y = mPoint.Y - moveDisY;         

                mEnvelope.CenterAt(mPoint);
                axMapControl1.ActiveView.Extent = mEnvelope;
                axMapControl1.ActiveView.Refresh();
            }
        }
   
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值