×
您的位置: 首页 > 编程笔记

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

ArcGIS Windows AR 时间:2010-12-26  查看:501   收藏
摘要:

(九) 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 );

// 设置颜色属性

color.RGB = 255;

// 获取ILine符号接口

ILineSymbol outline = new );

// 设置线符号属性

outline.Width = 1.5;

outline.Color = color;

// 获取IFillSymbol接口

ISimpleFillSymbol simpleFillSymbol = new );

// 设置填充符号属性

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使用的符号

);

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

// ……

} 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事件

= new ITransformEvents_VisibleBoundsUpdatedEventHandler(OnVisibleBoundsUpdated);

((ITransformEvents_Event

.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;

}

// 如果前景状态被重绘

viewDrawPhase = (esriViewDrawPhase)e.viewDrawPhase;

if ( viewDrawPhase == esriViewDrawPhase.esriViewForeground )

{

IGeometry geometry = m_Envelope;

geometry, ref m_FillSymbol);

}

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

 

0% (0)
0% (0)