一起学习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是设置工具的图标信息

你可能感兴趣的:(ArcEngine)