GIS二次开发之平移

     在上一篇文章中,简单的实现了一些常用的功能,当时里面的IToolBarControl是通过设置Buddy属性和AxMapControl绑定的,接下来的几篇文章会简单的介绍一下自己如何实现这些功能。

     今天简单的看看平移(Pan).简单的看了一下,目前我这边有三种方法可以实现Pan,当然这三种方法都是利用AE自带的一些方法或是属性实现。

     AE本身在二次开发的时候为了方便开发人员,将各个功能独立起来,开发人员只需要简单的设置一些属性即可实现很强大的功能。同样继承这种思想,将接下来实现的Pan功能也注册到机器中,作为功能插件使用。

      在建立项目的时候,建立一个“类库”,然后在引用中添加AE的一些常用的引用。

      第一种:

      在刚建立的类库中添加一个类,类名随便,这里是MapPan

代码
        public MapPan()
        {
            
string[] res = GetType().Assembly.GetManifestResourceNames();

            
base.m_bitmap = new System.Drawing.Bitmap(GetType().Assembly.GetManifestResourceStream("Commands.pan.bmp"));
            
base.m_caption = "平移地图";
            
base.m_category = "ToolBar";
            
base.m_message = "漫游地图";
            
base.m_name = "ToolBar_MapPan";
            
base.m_toolTip = "平移";
            m_startPan 
= true;
            
try
            {
                
base.m_cursor = new System.Windows.Forms.Cursor(GetType().Assembly.GetManifestResourceStream("Commands.Hand.cur"));
            }
            
catch (Exception ex)
            {

            }
        }

        
public override void OnCreate(object hook)
        {
            
try
            {
                m_HookHelper.Hook 
= hook;
                m_pActiveView 
= m_HookHelper.ActiveView as IActiveView;
            }
            
catch { m_pActiveView = null; }
        }

        
public override void OnMouseDown(int Button, int Shift, int X, int Y)
        {
            
if (Button != 1return;
            
if (!m_startPan) return;
            
try
            {
                IPoint pPt 
= m_pActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(X, Y);
                m_pActiveView.ScreenDisplay.PanStart(pPt);
                m_PanOperation 
= true;
            }
            
catch { m_PanOperation = false; }
        }

        
public override void OnMouseUp(int Button, int Shift, int X, int Y)
        {
            
if (Button != 1return;
            
if (!m_PanOperation) return;
            
if (!m_startPan) return;

            IEnvelope m_pEnvelope 
= m_pActiveView.ScreenDisplay.PanStop();
            
if (null != m_pEnvelope)
            {
                
//m_pActiveView.Extent = m_pEnvelope;
                m_pActiveView.ScreenDisplay.DisplayTransformation.VisibleBounds = m_pEnvelope;
                m_pActiveView.ScreenDisplay.Invalidate(
nulltrue, (short)esriScreenCache.esriAllScreenCaches);
            }
            m_PanOperation 
= false;
        }

        
public override void OnMouseMove(int Button, int Shift, int X, int Y)
        {
            
if (Button != 1return;
            
if (!m_PanOperation) return;
            
if (!m_startPan) return;

            
try
            {
                IPoint pPt 
= m_pActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(X, Y);
                m_pActiveView.ScreenDisplay.PanMoveTo(pPt);

            }
            
catch { }
        }
        
        
//按ESC按键取消
        public override void OnKeyDown(int keyCode, int Shift)
        {
            
base.OnKeyDown(keyCode, Shift);
            
if (keyCode == 27)
            {
                m_startPan 
= false;
                
base.m_cursor = System.Windows.Forms.Cursors.Default;
            }
        }

     是不是感觉很容易,主要借助PanStart、PanMoveTo、PanStop三个方法,先不要感叹了,因为接下来的两个方法更容易

    第二种方法:

代码
        public MapPan()
        {
            
string[] res = GetType().Assembly.GetManifestResourceNames();

            
base.m_bitmap = new System.Drawing.Bitmap(GetType().Assembly.GetManifestResourceStream("Commands.pan.bmp"));
            
base.m_caption = "平移地图";
            
base.m_category = "ToolBar";
            
base.m_message = "漫游地图";
            
base.m_name = "ToolBar_MapPan";
            
base.m_toolTip = "平移";
            m_startPan 
= true;
            
try
            {
                
base.m_cursor = new System.Windows.Forms.Cursor(GetType().Assembly.GetManifestResourceStream("Commands.Hand.cur"));
            }
            
catch (Exception ex)
            {

            }
        }

        
public override void OnCreate(object hook)
        {
            
try
            {
                m_HookHelper.Hook 
= hook;
                m_pActiveView 
= m_HookHelper.ActiveView as IActiveView;
            }
            
catch { m_pActiveView = null; }
        }

        //和方法1中不同的地方
        
public override void OnMouseMove(int Button, int Shift, int X, int Y)
        {
           m_pActiveView.ScreenDisplay.TrackPan();
        }

        
public override void OnKeyDown(int keyCode, int Shift)
        {
            
base.OnKeyDown(keyCode, Shift);
            
if (keyCode == 27)
            {
                m_startPan 
= false;
                
base.m_cursor = System.Windows.Forms.Cursors.Default;
            }
        }

     第二种方法中用TrackPan方法就完全省去了之前方法中的MouseDown和MouseUp。接下来是看第三种方法,更让人受不了。

     前两种方法是可以编译成DLL,注册到机器中去的,在调用的时候,可以如下面的代码

代码
        #region 定义工具栏
        
private void DefineToolBarControl()
        {
            
string progID = "CSharpDotNETCommands.MapPan";//命名空间.类名
            axToolbarControl1.AddItem(progID, 
-1-1false0, esriCommandStyles.esriCommandStyleIconAndText);
        }
        
#endregion

       最后一种方法是可以直接编写在主窗体程序中的

       第三种方法:

代码
        bool m_startPan = false;
        //BUTTON按钮事件
        
private void btnMapPan_Click(object sender, EventArgs e)
        {
            m_startPan 
= true;
        }

        
private void axMapMain_OnMouseDown(object sender, IMapControlEvents2_OnMouseDownEvent e)
        {
            
if (e.button == 1)
            {
                
if (m_startPan)
                {
                    axMapMain.Pan();
                }
            }
        }

     是不是最后一种方法最简单。哈哈

  

    当然这里的方法只是个人知道的方法,肯定还有很多方法,比如ControlsMapPanTool,这个方法没有试过,既然网上有这样的代码,也肯定是行的痛的,可以多尝试。

原文地址:https://www.cnblogs.com/wangyong/p/1894690.html