GIS二次开发之缩小

     前一篇随笔中记录了地图放大功能的实现,其中很多方法和这篇中要说的缩小很像,比如ControlsMapZoomOutTool和ControlsMapZoomOutFixedCommand。那在这篇中就忽略掉这两个方法的实现了,直接看看自定义缩小功能的实现代码

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

            
base .m_bitmap  =   new  System.Drawing.Bitmap(GetType().Assembly.GetManifestResourceStream( " Commands.zoomout.bmp " ));
            
base .m_caption  =   " 缩小地图 " ;
            
base .m_category  =   " ToolBar " ;
            
base .m_message  =   " 缩小地图 " ;
            
base .m_name  =   " ToolBar_MapPan " ;
            
base .m_toolTip  =   " 缩小 " ;
            m_ZoomOutStart 
=   true ;
            m_feedBack 
=   null ;
            
try
            {
                
base .m_cursor  =   new  System.Windows.Forms.Cursor(GetType().Assembly.GetManifestResourceStream( " Commands.ZoomOut.CUR " ));
            }
            
catch  (Exception ex)
            {

            }
        }

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

        
public   override   void  OnMouseDown( int  Button,  int  Shift,  int  X,  int  Y)
        {
            
if  ( null   ==  m_pActiveView)  return ;
            m_pPoint 
=  m_pActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(X, Y);
            m_ZoomOutStart 
=   true ;
            m_feedBack 
=   null ;
        }

        
public   override   void  OnMouseMove( int  Button,  int  Shift,  int  X,  int  Y)
        {
            
if  ( null   ==  m_pActiveView)  return ;
            
if  ( ! m_ZoomOutStart)  return ;

            
if  (m_feedBack  ==   null )
            {
                m_feedBack 
=   new  NewEnvelopeFeedbackClass();
                
if  (Button  ==   1 )
                {
                    m_feedBack.Display 
=  m_pActiveView.ScreenDisplay;
                    m_feedBack.Start(m_pPoint);
                }
            }
            m_feedBack.MoveTo(m_pActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(X, Y));
        }

        
public   override   void  OnMouseUp( int  Button,  int  Shift,  int  X,  int  Y)
        {
            
if  ( null   ==  m_pActiveView)  return ;
            
if  ( ! m_ZoomOutStart)  return ;
            IEnvelope m_pEnvelope 
=   new  EnvelopeClass();
            
if  ( null   ==  m_feedBack)  // 点击缩小
            {
                m_pEnvelope 
=  m_pActiveView.Extent;
                m_pEnvelope.Expand(
2 2 true );
                m_pActiveView.Extent.CenterAt(m_pPoint);
            }
            
else   // 拉框缩小
            {
                IEnvelope m_pFeedEnvelope 
=   new  EnvelopeClass();
                m_pFeedEnvelope 
=  m_feedBack.Stop();
                
try
                {
                     //这里是与放大代码不同的地方
                    
double  newWidth  =  m_pActiveView.Extent.Width  *  (m_pActiveView.Extent.Width  /  m_pFeedEnvelope.Width);
                    
double  newHeight  =  m_pActiveView.Extent.Height  *  (m_pActiveView.Extent.Height  /  m_pFeedEnvelope.Height);

                    
double  newXmin  =  m_pActiveView.Extent.XMin  -  ((m_pFeedEnvelope.XMin  -  m_pActiveView.Extent.XMin)  *  (m_pActiveView.Extent.Width  /  m_pFeedEnvelope.Width));
                    
double  newYmin  =  m_pActiveView.Extent.YMin  -  ((m_pFeedEnvelope.YMin  -  m_pActiveView.Extent.YMin)  *  (m_pActiveView.Extent.Height  /  m_pFeedEnvelope.Height));

                    m_pEnvelope.PutCoords(newXmin, newYmin, newXmin 
+  newWidth, newYmin  +  newHeight);
                }
                
catch
                {
                    m_pEnvelope 
=  m_pActiveView.Extent;
                    m_pEnvelope.Expand(
2 2 true );
                    m_pActiveView.Extent.CenterAt(m_pPoint);
                    m_feedBack 
=   null ;
                    m_ZoomOutStart 
=   false ;
                }
            }

            m_pActiveView.Extent 
=  m_pEnvelope;

            m_pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, 
null null );

            m_feedBack 
=   null ;
            Marshal.ReleaseComObject(m_feedBack);
            m_ZoomOutStart 
=   false ;
        }

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

       可以看到缩小与放大不同之处

       ①:在点击缩放的时候m_pEnvelope.Expand(0.5,0.5,true) 和m_pEnvelope.Expand(2,2,true)的不同,应该很容易理解,打个比方,比如把当前的地图比作为1m*1m的标准地图,Expand(0.5,0.5,true),相当于是说将0.5m*0.5m的地图视图放大1m*1m的“地图框架”中,为了充满这个“地图框架”,应该要放大。(哈哈,应该可以这样理解),同样,缩小也就好理解了。

       ②:在拉框缩放的时候,放大中直接按照绘制的矩形框的大小进行放大,在缩小的时候,需要set new coordinate,就像屏幕的分辨率一样,重置到当前“屏幕”的大小(就是重定义ActiveView.Extent的Xmin,Ymin,Xmax,Ymax)。

转载于:https://www.cnblogs.com/wangyong/archive/2010/12/08/1899889.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值