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

来源:互联网 发布:美国自费留学 知乎 编辑:程序博客网 时间:2024/05/16 11:36

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();            }        }       }


0 0