zoukankan      html  css  js  c++  java
  • 一起学习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是设置工具的图标信息

  • 相关阅读:
    Loadrunner脚本自动关联和手动关联
    Linux常用命令大全
    linux软件的安装和卸载
    PL/SQL DEVELOPER执行计划的查看
    利用pl/sql执行计划评估SQL语句的性能简析
    LoadRunner监控Linux与Windows方法
    LR添加Windows和Linux压力机实战
    《JS设计模式笔记》 4,桥接模式
    《ES6基础教程》之 Call 方法和 Apply 方法
    《JS设计模式笔记》 3,观察者模式
  • 原文地址:https://www.cnblogs.com/liuyh208/p/1560396.html
Copyright © 2011-2022 走看看