|
|
|
|

利用ArcGIS Engine、VS .NET和Windows控件开发GIS应用(五)

(九) 在MapControl上绘制图形 你可以将MapControl作为缩略图窗体使用,并在其上绘制显示PageLayoutControl内的焦点地图的当前范围。当你浏览PageLayoutControl数据框架内的数据时,你将看到缩略图窗口也进行了更新。 注:使用地图导航工具导航焦点图...

作者:3STECH来源:中国3S网站(httpwww.863s.com)|2006年12月15日

(九) MapControl上绘制图形

你可以将MapControl作为缩略图窗体使用,并在其上绘制显示PageLayoutControl内的焦点地图的当前范围。当你浏览PageLayoutControl数据框架内的数据时,你将看到缩略图窗口也进行了更新。

注:使用地图导航工具导航焦点图(活动图)将改变PageLayoutControl中焦点地图的范围并引起MapControl更新。使用页面布局工具导航页面布局将改变页面布局的范围(不是PageLayoutControl中的焦点图的范围),而MapControl将不更新。

1.       向类中增加下列成员变量:

    public class Form1 : System.Windows.Forms.Form

    {

        private ESRI.ARCGIS.MapControl.AxMapControl axMapControl1;

        private ESRI.ARCGIS.PageLayoutControl.AxPageLayoutControl axPageLayoutControl1;

        private ESRI.ARCGIS.TOCControl.AxTOCControl axTOCControl1;

        private ESRI.ARCGIS.ToolbarControl.AxToolbarControl axToolbarControl1;

 

        private IToolbarMenu m_ToolbarMenu = new ToolbarMenuClass(); // 弹出式菜单

 

        private IEnvelope m_Envelope;  // MapControl绘制的范围

        private Object m_FillSymbol;   // MapControl上绘制范围使用的符号

        private ITransformEvents_VisibleBoundsUpdatedEventHandler

            visBoundsUpdatedE;         // PageLayoutControl的焦点图事件

注:声明的变量visBoundsUpdatedE是一个托管。托管是一个类,它能够拥有对指定方法的引用,并使它链接到一个特定的事件。在事件和方法之间的链接过程有时在.NET中被称作wiring

2.       创建一个叫CreateOverviewSymbol的新函数。这个函数是创建你将在MapControl中使用的符号的地方,此符号是用来描述PageLayoutControl焦点地图数据范围的。函数中增加的代码如下:

private void CreateOverviewSymbol()

        {

            // 获取IRGBColor接口

            IRgbColor color = new RgbColor();

            // 设置颜色属性

            color.RGB = 255;

 

            // 获取ILine符号接口

            ILineSymbol outline = new SimpleLineSymbol();

            // 设置线符号属性

            outline.Width = 1.5;

            outline.Color = color;

 

            // 获取IFillSymbol接口

            ISimpleFillSymbol simpleFillSymbol = new SimpleFillSymbolClass();

            // 设置填充符号属性

            simpleFillSymbol.Outline = outline;

            simpleFillSymbol.Style = esriSimpleFillStyle.esriSFSHollow;

            m_FillSymbol = simpleFillSymbol;          

}

3.       Form_Load事件在TOCControl标签编辑代码之前调用CreateOverviewSymbol函数。

        private void Form1_Load(object sender, System.EventArgs e)

        {

            // 当缩放时禁止重绘

            this.SetStyle(ControlStyles.EnableNotifyMessage, true);

 

            // 创建MapControl使用的符号

    CreateOverviewSymbol();

 

// 下面是标签编辑处理代码

// ……

}

4.       增加下列OnVisibleBoundsUpdated函数。此函数将与地图范围改变时触发的事件相连接,并用来设置新的地图可见边界范围框。通过刷新MapControl,你强制它重绘其上显示的图形。

        private void OnVisibleBoundsUpdated(IDisplayTransformation sender, bool sizeChanged)

        {

            // 设置新的可见范围

            m_Envelope = sender.VisibleBounds;

 

            // 改变MapControl的前景状态

axMapControl1.ActiveView.PartialRefresh(

esriViewDrawPhase,esriViewForeground, null, null);   

}

5.       PageLayoutControl默认的事件接口是IPageLayoutControlEvents。这些事件不告诉我们数据边框内的地图范围。为此你需要使用PageLayoutControl的焦点地图的ItransformEvents接口。在PageLayoutControl_OnPageLayoutReplaced事件处理中的加载文档代码前面增加以下代码。

private void axPageLayoutControl1_OnPageLayoutReplaced(object sender, ESRI.ARCGIS.PageLayoutControl.IPageLayoutControlEvents_OnPageLayoutReplacedEvent e)

        {

            // 获取PageLayoutControl中焦点地图的IActiveView对象

            IActiveView activeView = (IActiveView)

                axPageLayoutControl1.ActiveView.FocusMap;

 

            // 捕捉PageLayoutControl的焦点图的ITransformEvents事件

            visBoundsUpdatedE = new            ITransformEvents_VisibleBoundsUpdatedEventHandler(OnVisibleBoundsUpdated);

            ((ITransformEvents_Event)activeView.ScreenDisplay

                .DisplayTransformation).VisibleBoundsUpdated += visBoundsUpdatedE;

           

            // 获取焦点图的范围

    m_Envelope = activeView.Extent;

   

    // 后面是加载地图文档的代码

    // ……

6.       在设计模式下显示窗体并从属性窗中选择axMapControl1,显示axMapControl事件。双击OnAfterDraw向代码窗口中增加事件处理。

7.       axMapControl1_OnAfterDraw事件处理中增加以下代码,使用前面创建的符号绘制MapControl显示边框。

private void axMapControl1_OnAfterDraw(object sender, ESRI.ArcGIS.MapControl.IMapControlEvents2_OnAfterDrawEvent e)

        {

            if ( m_Envelope == null)

            {

                return;

            }

 

            // 如果前景状态被重绘

            esriViewDrawPhase viewDrawPhase = (esriViewDrawPhase)e.viewDrawPhase;

            if ( viewDrawPhase == esriViewDrawPhase.esriViewForeground )

            {

                IGeometry geometry = m_Envelope;

                axMapControl1.DrawShape(geometry, ref m_FillSymbol);

            }

}

生成并运行应用程序。使用你先前已经加好的地图导航工具改变PageLayoutControl中焦点地图的范围。新的范围被绘制在MapControl上。

上一篇:利用ArcGIS Engine、VS .NET和Windows控…

下一篇:利用ArcGIS Engine、VS .NET和Windows控…