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  !=   1 return ;
            
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  !=   1 return ;
            
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(
null true , ( short )esriScreenCache.esriAllScreenCaches);
            }
            m_PanOperation 
=   false ;
        }

        
public   override   void  OnMouseMove( int  Button,  int  Shift,  int  X,  int  Y)
        {
            
if  (Button  !=   1 return ;
            
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 - 1 false 0 , 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,这个方法没有试过,既然网上有这样的代码,也肯定是行的痛的,可以多尝试。

你可能感兴趣的:(二次开发)