一起学习ArcEngine(1)放大工具

地图操作的工具,大部分ArcEngine都有现成的,但是这些工具不太好用,比如提示和名称都是英文,地图操作中没有右键,无法和vs提供的工具条控件或第三方工具条控件集成等,还是自己实现比较灵活方便。

    我们就从最简单的放大工具开始来实现地图操作常用的工具吧!

废话少说,先上代码

using System;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.Controls;
using ESRI.ArcGIS.Display;
using ESRI.ArcGIS.SystemUI;
using ESRI.ArcGIS.ADF.CATIDs;
using System.Runtime.InteropServices;

namespace TechFront.TPIS2.GisCommFun
{
    public class ZoomIn : ICommand, ITool
    {
       
        [DllImport("gdi32.dll")]
        static extern bool DeleteObject(IntPtr hObject);

        private System.Drawing.Bitmap m_bitmap;
        private IntPtr m_hBitmap;
        private IHookHelper m_pHookHelper;
        private INewEnvelopeFeedback m_feedBack;
        private IPoint m_point;
        private Boolean m_isMouseDown;
        private System.Windows.Forms.Cursor m_zoomInCur;
        private System.Windows.Forms.Cursor m_moveZoomInCur;

        public ZoomIn()
        {
            //Load resources
            string[] res = GetType().Assembly.GetManifestResourceNames();
            if (res.GetLength(0) > 0)
            {
                m_bitmap = new System.Drawing.Bitmap(GetType().Assembly.GetManifestResourceStream(GetType(), "Bmp.ZoomIn.bmp"));
                if (m_bitmap != null)
                {
                    m_bitmap.MakeTransparent(m_bitmap.GetPixel(1, 1));
                    m_hBitmap = m_bitmap.GetHbitmap();
                }
            }
            m_pHookHelper = new HookHelperClass();
        }

        ~ZoomIn()
        {
            if (m_hBitmap.ToInt32() != 0)
                DeleteObject(m_hBitmap);

            m_pHookHelper = null;
            m_zoomInCur = null;
            m_moveZoomInCur = null;
        }

        #region ICommand Members

        public void OnClick()
        {
        }

        public string Message
        {
            get
            {
                return "放大地图";
            }
        }

        public int Bitmap
        {
            get
            {
                return m_hBitmap.ToInt32();
            }
        }

        public void OnCreate(object hook)
        {
            m_pHookHelper.Hook = hook;
            m_zoomInCur = new System.Windows.Forms.Cursor(GetType().Assembly.GetManifestResourceStream(GetType(), "Cur.ZoomIn.cur"));
            m_moveZoomInCur = new System.Windows.Forms.Cursor(GetType().Assembly.GetManifestResourceStream(GetType(), "Cur.MoveZoomIn.cur"));
        }

        public string Caption
        {
            get
            {
                return "放大";
            }
        }

        public string Tooltip
        {
            get
            {
                return "放大";
            }
        }

        public int HelpContextID
        {
            get
            {
                // TODO:  Add ZoomIn.HelpContextID getter implementation
                return 0;
            }
        }

        public string Name
        {
            get
            {
                return "ZoomIn";
            }
        }

        public bool Checked
        {
            get
            {
                return false;
            }
        }

        public bool Enabled
        {
            get
            {
                if (m_pHookHelper.FocusMap == null) return false;

                return true;
            }
        }

        public string HelpFile
        {
            get
            {
                // TODO:  Add ZoomIn.HelpFile getter implementation
                return null;
            }
        }

        public string Category
        {
            get
            {
                return "GisCommFun";
            }
        }

        #endregion

        #region ITool Members

        public void OnMouseDown(int button, int shift, int x, int y)
        {
            if (m_pHookHelper.ActiveView == null) return;

            //If the active view is a page layout
            if (m_pHookHelper.ActiveView is IPageLayout)
            {
                //Create a point in map coordinates
                IPoint pPoint = (IPoint)m_pHookHelper.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(x, y);

                //Get the map if the point is within a data frame
                IMap pMap = m_pHookHelper.ActiveView.HitTestMap(pPoint);

                if (pMap == null) return;

                //Set the map to be the page layout's focus map
                if (pMap != m_pHookHelper.FocusMap)
                {
                    m_pHookHelper.ActiveView.FocusMap = pMap;
                    m_pHookHelper.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);
                }
            }
            //Create a point in map coordinates
            IActiveView pActiveView = (IActiveView)m_pHookHelper.FocusMap;
            m_point = pActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(x, y);

            m_isMouseDown = true;

        }

        public void OnMouseMove(int button, int shift, int x, int y)
        {
            if (!m_isMouseDown) return;

            //Get the focus map
            IActiveView pActiveView = (IActiveView)m_pHookHelper.FocusMap;

            //Start an envelope feedback
            if (m_feedBack == null)
            {
                m_feedBack = new NewEnvelopeFeedbackClass();
                m_feedBack.Display = pActiveView.ScreenDisplay;
                m_feedBack.Start(m_point);
            }

            //Move the envelope feedback
            m_feedBack.MoveTo(pActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(x, y));
        }

        public void OnMouseUp(int button, int shift, int x, int y)
        {
            if (!m_isMouseDown) return;

            //Get the focus map
            IActiveView pActiveView = (IActiveView)m_pHookHelper.FocusMap;

            //If an envelope has not been tracked
            IEnvelope pEnvelope;

            if (m_feedBack == null)
            {
                //Zoom in from mouse click
                pEnvelope = pActiveView.Extent;
                pEnvelope.Expand(0.5, 0.5, true);
                pEnvelope.CenterAt(m_point);
            }
            else
            {
                //Stop the envelope feedback
                pEnvelope = m_feedBack.Stop();

                //Exit if the envelope height or width is 0
                if (pEnvelope.Width == 0 || pEnvelope.Height == 0)
                {
                    m_feedBack = null;
                    m_isMouseDown = false;
                }
            }
            //Set the new extent
            pActiveView.Extent = pEnvelope;
            //Refresh the active view
            pActiveView.Refresh();
            m_feedBack = null;
            m_isMouseDown = false;
        }

        public void OnKeyDown(int keyCode, int shift)
        {
            if (m_isMouseDown)
            {
                if (keyCode == 27)
                {
                    m_isMouseDown = false;
                    m_feedBack = null;
                    m_pHookHelper.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewForeground, null, null);
                }
            }
        }

        public void OnKeyUp(int keyCode, int shift)
        {
            // TODO:  Add ZoomIn.OnKeyUp implementation
        }

        public int Cursor
        {
            get
            {
                if (m_isMouseDown)
                    return m_moveZoomInCur.Handle.ToInt32();
                else
                    return m_zoomInCur.Handle.ToInt32();
            }
        }

        public bool OnContextMenu(int x, int y)
        {
            // TODO:  Add ZoomIn.OnContextMenu implementation
            return false;
        }

        public bool Deactivate()
        {
            return true;
        }

        public void Refresh(int hdc)
        {
            // TODO:  Add ZoomIn.Refresh implementation
        }

        public void OnDblClick()
        {
            // TODO:  Add ZoomIn.OnDblClick implementation
        }

        #endregion
    }
}

其实,放大工具 主要是实现Itool的OnMouseDown、OnMouseMove、OnMouseUp三个方法,设置ICommand的Caption,Tooltip、Message、Bitmap属性,实现OnCreate方法。

Itool的三个方法由名称就可以知道,三个方法分别是在鼠标按下左键时、按下左键移动时、鼠标弹起时执行。

Caption属性是设置工具显示的文本;Tooltip是设置鼠标移到工具上时,提示的信息;Bitmap是设置工具的图标信息

原文地址:https://www.cnblogs.com/liuyh208/p/1560396.html