使用ArcGIS实现的鹰眼图-----关于MapControl控件的使用理解

namespace ArcGISNumberOne
{
    public partial class EagleEyeMap : Form
    {
        public EagleEyeMap()
        {
            InitializeComponent();
        }
        //OnExtentUpdated事件在MapControl的可视化范围发生变化后发生.改变MapControl中可视化范围的途径包括精确设置范围、缩放、
        //漫游或使用IMapControl2::CenterAt方法等
        private void MainForm_OnExtentUpdated(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnExtentUpdatedEvent e)
        {
            //IEnvelope是指地物的外接矩形,用来表示地物图形的大体位置和形状,一般可用于检索地物,判断地物间的拓扑关系,可以使得检索、判断的速度加快
            IEnvelope pEnvelop = (IEnvelope)e.newEnvelope;
            //IGraphicsContainer主要是管理map上Element对象的。
            //Elements也通常被称作Map Elemnts(地图元素)。
            //除了数据框(data frame),大多数地图包含一个或多个其他的地图元素,包括:图名,指北针,图例,比例尺条,文字比例尺,图表,报表,文字标注(应该是in the map类型的annotation或自己添加的文本标注内容)和图形(graphics)。
            //这些elements的一个共性就是,其主要目的是修饰或标记地图,而不是地理对象本身的抽象。也就是说,不是我们通常所说的地理要素(feature)。这种不同表现在,没有图层承载(实际上是annotation layer等图层承载),最主要的,是没有关联的属性数据(attribute table)。
            IGraphicsContainer pGraphicsContainer = DeputyForm.Map as IGraphicsContainer;
            //IActiveView 接口定义了 Map 对象的数据显示功能,这个接口管理着绘制图形的显示范围。
            IActiveView pActiveView = pGraphicsContainer as IActiveView;

            pGraphicsContainer.DeleteAllElements(); //在绘制前,清除axMapControl2中的任何图形元素
            //IRectangleElement:标识一个矩形元素的指示器接口。显示矩形的图形元素。
            IRectangleElement pRectangleEle = new RectangleElementClass();
            IElement pElement = pRectangleEle as IElement;
            pElement.Geometry = pEnvelop;//Geometry:几何属性将返回与元素相关的形状,作为一种ige量度。

            //设置鹰眼图中的红线框
            IRgbColor pColor = new RgbColorClass();
            pColor.Red = 255;
            pColor.Green = 0;
            pColor.Blue = 0;
            pColor.Transparency = 255;//这个属性设置透明度;透明:0;不透明:255
            //产生一个线符号对象
            ILineSymbol pOutline = new SimpleLineSymbolClass();
            pOutline.Width = 3;
            pOutline.Color = pColor;
            //设置颜色属性
            pColor = new RgbColorClass();
            pColor.Red = 255;
            pColor.Green = 0;
            pColor.Blue = 0;
            pColor.Transparency = 0;
            //设置填充符号的属性
            IFillSymbol pFillSymbol = new SimpleFillSymbolClass();
            pFillSymbol.Color = pColor;
            pFillSymbol.Outline = pOutline;

            IFillShapeElement pFillShapeEle = pElement as IFillShapeElement;
            pFillShapeEle.Symbol = pFillSymbol;
            pGraphicsContainer.AddElement((IElement)pFillShapeEle, 0);
            pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);
        }
        //OnMapReplace事件发生MapControl的地图被替换后,即IMapControl2::Map被另一个地图替换时(如IMapControl2::LoadMxFile方法被调用时或map属性被明确替换时)触发该事件。用这个事件来保持与当前图层同步。
        private void MainForm_OnMapReplaced(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnMapReplacedEvent e)
        {
            if (MainForm.LayerCount > 0)
            {
                DeputyForm.Map = new MapClass();
                for (int i = 0; i <= MainForm.Map.LayerCount - 1; i++)
                {
                    DeputyForm.AddLayer(MainForm.get_Layer(i));
                }
                DeputyForm.Extent = MainForm.Extent;//设置MapControl的显示范围跟主窗体一致

                DeputyForm.Refresh();
            }
        }
        //当在MapControl上移动鼠标时不断地触发OnMouseMove事件。
        private void DeputyForm_OnMouseMove(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnMouseMoveEvent e)
        {
            if (e.button == 1)// 按下鼠标左键移动矩形框
            {
                IPoint pPoint = new PointClass();
                pPoint.PutCoords(e.mapX, e.mapY);
                MainForm.CenterAt(pPoint);
                MainForm.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography,null, null);
            }
        }
        //当在MapControl上点击鼠标任何键时触发OnMouseDown事件。
        private void DeputyForm_OnMouseDown(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnMouseDownEvent e)
        {
            if (DeputyForm.Map.LayerCount > 0)
            {
                if (e.button == 1)
                {
                    IPoint pPoint = new PointClass();
                    pPoint.PutCoords(e.mapX, e.mapY);
                    MainForm.CenterAt(pPoint);
                    MainForm.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, null, null);
                }
                else if (e.button == 2)//按下鼠标右键移动矩形框
                {
                    IEnvelope pEnv = DeputyForm.TrackRectangle();//TrackRectangle:一个用户定义的矩形
                    MainForm.Extent = pEnv;
                    MainForm.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, null, null);
                }
            }
        }
    }
}
喜欢的朋友们,可以点个赞!

你可能感兴趣的:(基于C#的AE二次开发)