ArcGISEngineC#实例开发教程_第1页
ArcGISEngineC#实例开发教程_第2页
ArcGISEngineC#实例开发教程_第3页
ArcGISEngineC#实例开发教程_第4页
ArcGISEngineC#实例开发教程_第5页
已阅读5页,还剩76页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

《ArcGISEngine+C#实例开发教程》

作者:3SDN.Net文章来源:3SDN原创点击数:14478更新时间:2009-5-12

摘要:《ArcGISEngine+C#实例开发教程》,面向ArcGISEngine(以下简称AE)开发初

学者,本教程将帮助您进一步理解AE的体系结构与开发方法,掌握基本的GIS桌面应用程

序的开发。

版权声明:

《ArcGISEngine+。实例开发教程》为3SDN(http://ww)原创教程,版

权所有。禁止商业用途转载(如需请联系作者),非商业用途转载请注明出处。教程采用

C#语言,以VS2005为开发工具。

读者对象:

ArcGISEngine(以下简称AE)开发初学者,了解AE基本体系,了解C#基本语法,

了解VS2005的基本使用方法。

预期学习效果:

进一步理解AE的体系结构与开发方法,掌握基本的GIS桌面应用程序的开发。

教程目录:

《ArcGISEngine+C#实例开发教程》1

第一讲:桌面GIS应用程序框架的建立2

1、新建项目3

2、添加控件4

3、控件绑定5

4、添加工具6

5、编译运行7

第二讲菜单的添加及其实现7

1、添加菜单7

2、实现相关菜单8

3、编译运行10

第三讲MapControl与PageLayoutControl同步11

1、新建同步类ControlsSynchronizer11

2、新建Maps类17

3、新建打开文档类OpenNewMapDocument20

4、两种视图的同步21

5、编译运行24

第四讲状态栏信息的添加与实现25

1、添加状态栏项目25

2、显示当前所用工具信息26

3、显示当前比例尺27

4、显示当前坐标27

5、编译运行30

第五讲鹰眼的实现30

1、添加鹰眼控件31

2、鹰眼的实现34

第六讲右键菜单添加与实现39

1、创建右键菜单39

2、添加菜单项40

3、弹出右键菜单44

4、编译运行45

第六讲:教程Bug及解决方法45

到第六讲为止已经发现的教程Bug及解决方法如下:45

目前已经发现的优化方案如下:46

第七讲图层符号选择器的实现146

1、直接调用ArcMap中的符号选择器49

2、自定义符号选择器51

2.1新建符号选择器窗体51

2.2设置控件属性52

2.3添加引用53

2.4初始化53

2.5调用自定义符号选择器58

2.6符号参数调整60

2.7添加更多符号菜单65

2.8编译运行67

第八讲属性数据表的查询显示67

1.创建属性表窗体68

2.创建空DataTable69

3.装载DataTable数据73

4.绑定DataTable到DataGridView76

5.调用属性表窗体78

6.编译运行81

第一讲:桌面GIS应用程序框架的建立

本讲主要是使用MapControKPageLayoutControLToolbarControKTCXSControl四个

控件建立起基本的桌面GIS应用程序框架。最终成果预览如下:

1、新建项目

启动VS2005,选择“文件|新建|项目”,在项目类型中选择VisualC#,再选择Windows应

用程序模板,输入名称“3sdnMap”,点击确定。

在解决方案管理器中将“Form1.cs”重命名为“3sdnMap.cs”,在设计视图中,选中窗体,将其

属性中的“Text”改为“3sdnMap”。

2、添加控件

选择工具箱中的“菜单和工具栏|MenuStrip",将其拖入窗体。

选择工具箱中的“ArcGISWindowsForms”节,将“Toolbarcontrol”控件拖入窗体,并将其属

性中的Dock设置为Top。

选择工具箱中的“菜单和工具栏|StatusStrip”,将其拖入到窗体。

选择工具箱中的“容器ISphtContainer”容器拖入窗体,并将其属性中的Dock设置为Fill。

将TabControl控件拖入Panell,将Alignment属性设置为Bottom,Dock属性设置为FilL

点击TabPages属性右边的按钮,弹出TabPage集合编辑器,将tabPagel的Name设置为

tabPageLayer,Text设置为图层,将tabPage2的Name设置为tabPageProperty,Text设

置为属性。如下所示。

选择“图层”选项卡,拖入TOCControl控件,设置Dock属性为Fill。

选择“属性”选项卡,拖入DataGidView控件,设置Dock属性为Fill。

拖入TabControl控件到由nel2,设置Dock属性为Fill。并上述类似的方法,将两个选项卡

的Name和Text分别设置为:(tabPageMap、地图),(tabPageLayout,制版)。

选择“地图”选项卡,拖入M叩Control控件,设置Dock属性为RIL

选择"制版"选项卡,拖入PageLayoutControl控件,设置Dock属性为Fill。

最后将LicenseControl控件拖入到窗体的任意地方。

按F5编译运行,可以看到刚才布局好的程序界面了。

3、控件绑定

通过以上步骤添加的控件还只是单独存在,而我们的程序需要各控件间协同工作,因此要进

行控件绑定。

分别右击ToolbarControl>TOCControl控件,将Buddy设置为axM叩Control,如下图所

Zjso

这样,工具条和图层控件就与地图控件关联了。

4、添加工具

此时,工具条中还没有任何工具,添加的方法也很简单-右击Toolbarcontrol,选择“属性

|Items",点击Add,选择Commands选项卡中的Generic,双击Open、SaveAs、Redo、

Undo即可将相应工具添加到工具条。

常见的工具有:

MapNavigation中的导航工具,MapInquiry中的查询工具,FeatureSelection中的选择工

具,你可以根据需要酌情添加工具。

5、编译运行

按F5即可编译运行程序,至此桌面GIS应用程序框架基本框架已经搭建好了,你可以通过

工具条的工具打开地图文档,浏览地图了,效果如开篇所示.

第二讲菜单的添加及其实现

在上讲中,我们实现了应用程序基本框架,其中有个小错误,在此先跟大家说明下。在“属

性”选项卡中,我们当时添加的是DataGridView控件,这个控件是用来显示数据表的,而

专门用于属性的查询和设置的控件是PropertyGrid控件。因此请你删除“属性”选项卡中

的DataGridView控件,再把位于“工具箱I所有Windows窗体IPropertyGrid"(如果没

有,右击选择“选择项"以添加此控件)控件拖到该选项卡。

在这一讲中,主要讲解菜单的添加和实现。

1、添加菜单

在设计视图中,单击菜单栏,会出现“请在此处键入”的提示,单击提示就可以键入菜单名

称,如“文件”,再单击“文件”,即可输入其下拉子菜单,如下所示:

Tips:

每创建一个菜单,请在其属性面板中设置Name属性,而且不要为中文,因此Name值将

是此菜单响应函数的函数名的一部分,带中文的函数名,总是不好吧。

本讲中,我们将添加新建(New)、打开(Open)、添加数据(AddData)、保存(Save)、

另存为(SaveAs)、退出(Exit)这些菜单,()内为相应的Name属性值。

Tips:

你可以在属性面板中的Text属性中,把菜单名设置为中英文形式,如“打开Open”,带

下划线的0表示此项菜单的快捷键是字母0,设置方法是在相应字母前加上“&”字

符,如“打开&Open但这种快捷键只在打开此下拉菜单时才有效,即当你单击“文件”

菜单弹出下拉菜单时,按下字母O就可以定位到“打开”菜单。

还有一种在程序运行时都有效的全局快捷键,可以在属性面板中的“ShortCutKeys”中设

置。

你还可以在属性面板中的Image属性中设置你喜欢的菜单图标。单击Image那一行右边的

按钮,弹出如下菜单。选择“项目资源文件”,再单击导入就可以选择你的图标了。

最终效果如下所示。

注意,在解决方案面板中,选中刚才添加的所有图标,在其属性面板中将生成操作设置为“嵌

入的资源”,这一点很重要!

2、实现相关菜单

首先定义指针(写在publicpartialclassForml:Form下面即可):

privateESRI.ArcGIS.Controls.IM叩Controlm_mapControl=null;

privateESRLArcGIS.Controls.IPageLayoutControl2m_pageLayoutControl=null;

privateIMapDocumentpMapDocument;

若以上指针无效,请添加以下引用:

usingESRI.ArcGIS.Carto;

usingESRI.ArcGIS.Controls;

usingESRI.ArcGIS.esriSystem;

usingESRLArcGIS.Display;

usingESRI.ArcGIS.Geometry;

usingESRI.ArcGIS.SystemUI;

在设计视图中的属性面板中,选择Forml,即主窗体,单击事件按钮(闪电形状的那个按

钮),打到“Load”事件并双击,添加此事件。

在Forml_Load函数中初始化这些指针:

//取得MapControl和PageLayoutControl的引用

m_mapControl=(IMapControl3)this.axMapControl1.Object;

m_pageLayoutControl=(IPageLayoutControl2)this.axPageLayoutControl1.Object;

依次双击每个菜单项,添加菜单响应函数。实现代码如下:

III<summary>

///新建地图命令

III</summary>

///<paramname="sender's</param>

///<paramname='*e"></param>

privatevoidNew_Qick(objectsender,EventArgse)

{

//本命令涉及到MapControl和PageLayoutControl同步问题,将在下一讲中实现

)

III<summary>

///打开地图文档Mxd命令

III</summary>

///<paramname="sender"></param>

///<paramname="e"></param>

privatevoidOpen_Qick(objectsender,EventArgse)

(

//木命令涉及到MapControl和PageLayoutControl同步问题,将在下一讲中实现

)

III<summary>

///添加数据命令

III</summary>

///<paramname="sender's</param>

///<paramname="eH></param>

privatevoidAddData_Qick(objectsender,EventArgse)

{

intcurrentLayerCount=this.axMapControll.LayerCount;

ICommandpCommand=newControlsAddDataCommandaass();

pCommand.OnCreate(this.axMapControl1.Object);

pCommand.OnQickO;

)

///<summary>

///保存地图文档命令

///</summary>

///<paramname="sender"></param>

III<paramname="e"></param>

privatevoidSave_Qick(objectsender,EventArgse)

//首先确认当前地图文档是否有效

if(null!=mjDageLayoutControl.DocumentFlename&&m_mapControl.CheckMxFle(mjDageLayoutControl.

DocumentFilename))

{

//创建一个新的地图文档实例

IMapDocumentmapDoc=newMapDocumentOassO;

//打开当前地图文档

mapDoc.Open(mjDageLayoutControl.DocumentFilename,string.Empty);

//用PageLayout中的文档替换当前文档中的PageLayout部分

mapDoc.ReplaceContents((IMxdContents)mj3ageLayoutControl.PageLayout);

//保存地图文档

mapDoc.Save(mapDoc.UsesRelativePaths,false);

mapDoc.Qose();

)

)

///<summary>

///另存为地图文档命令

///</summary>

///<paramname="sender"></param>

///<paramname="eH></param>

privatevoidSaveAs_Qick(objectsender,EventArgse)

{

//调用另存为命令

ICommandcommand=newControlsSaveAsDocCommandClass();

command.OnCreate(m_controlsSynchronizer.ActiveControl);

command.OnQick();

)

///<summary>

///退出程序

///</summary>

///<paramname="sender's</param>

///<paramname="e"></param>

privatevoidExit_Oick(objectsender,EventArgse)

{

Application.Exit();

)

3、编译运行

按F5编译运行程序。也许你会发现,菜单命令的实现方式都是类型的。没错,在AE9.2中,

内置了许多常用的Command和Tool,如ControlsAddDataCommandClass、

ControlsMapZoomlnToolClass、ControlsMapPanToolClass等等,这些内置对象在

ESRLArcGIS.Controls命名空间中,你可以对象浏览器中查看。而且这些内置对象的调用方

式都类似,如下所示:

//定义

ICommandcommand=newControlsSaveAsDocCommandClass();

//创建

command.OnCreate(m_controlsSynchronizer.ActiveControl);

//调用

command.OnQick();

希望你可以举一反三,去实现更多的你想要的功能。

第三讲MapControl与PageLayoutControl同步

在ArcMap中,能够很方面地进行MapView和LayoutView两种视图的切换,而且二

者之间的数据是同步显示的。

关于两种视图同步的实现方法有多种,可以使用Objectcopy对象进行数据硬拷贝,而比较

简单的方法莫过于二者共享一份地图了,这也是最常用的方法。

1、新建同步类ControlsSynchronizer

在解决方案面板中右击项目名,选择“添加|类”,在类别中选择“VisualC#项目项",在模板

中选择“类”,输入类名“ControlsSynchronizer.cs",将以下代码覆盖自动生成的代码:

usingSystem;

usingSystem.Drawing;

using^stem.Collections;

using^stem.ComponentModel;

using^stem.Windows.Forms;

using0stem.10;

usingstem.Runtime.InteropServices;

usingESRI.ArcGIS.esriSystem;

usingESRI.ArcGIS.Carto;

usingESRI.ArcGIS.Controls;

usingESRI.ArcGIS.SystemUI;

namespace_sdnMap

(

///<summary>

///ThisclassisusedtosynchronizeagvenPageLayoutControlandaMapControl.

///Wheninitialized,theusermustpassthereferenceofthesecontroltotheclass,bind

///thecontroltogetherbycalling•BindControls'whichinturnsetsajoinedMapreferenced

///bybothcontrol;andsetallthebuddycontrolsjoinedbetweenthesetwocontrols.

///WhenalternatingbetweentheMapControlandPageLayoutControl,youshouldactivatethe

visiblecontrol

///anddeactivatetheotherbycallingActivateXXX.

///Thiscalssislimitedtoasituationwherethecontrolsarenotsimultaneouslyvisible.

///</summary>

publicclassControlsSynchronizer

{

#regionclassmembers

privateIMapControl3m_mapControl=null;

privateIPageLayoutControl2mjageLayoutControl=null;

privateIToolm_mapActiveTool=null;

privateIToolm_pageLayoutActiveTool=null;

privateboolmJsMapCtrlactive=true;

privateArrayListm_frameworkControls=null;

#endregion

#regionconstructor

///<summary>

///默认构造函数

///</summary>

publicControlsSynchronizer()

{

〃初始化ArrayUst

mJrameworkControls=newArrayList();

)

///<summary>

///构造函数

///</summary>

///<paramname="mapControl'S</param>

///<paramname="pageLayoutControl"></param>

publicControlsSynchronizer(IMapControl3mapControl,IPageLayoutControl2

pageLayoutControl)

:this()

(

〃为类成员赋值

m_mapControl=mapControl;

m_pageLayoutControl=pageLayoutControl;

)

#endregion

#regionproperties

///<summary>

///取得或设匏MapControl

///</summary>

publicIMapControl3MapControl

{

get{returnm_mapControl;}

set{m_mapControl=value;}

)

///<summary>

///取得或设置PageLayoutControl

///</summary>

publicIPageLayoutControlPageLayoutControl

{

get{returnm_pageLayoutControl;}

set{m_pageLayoutControl=value;}

}

///<summary>

III取得当前ActiveView的类型

///</summary>

publicstringActiveViewType

get

if(mJsMapCtrlactive)

return"MapContror1;

else

return"PageLayoutContror,;

)

)

III<summary>

///取得当前活动的Control

///</summary>

publicobjectActiveControl

{

get

(

if(m_mapControl==null||mjoageLayoutControl==null)

thrownewException(nControlsSynchronizer::ActiveControl:\r\nBtherMapControlor

PageLayoutControlarenotinitialized!'*);

if(m_lsMapCtrlactive)

returnm_mapControl.Object;

else

returnm_pageLayoutControl.Object;

)

)

#endregion

#regionMethods

///<summary>

///激活MapControl并解除thePagleLayoutControl

///</summary>

publicvoidActivateMapO

{

try

(

if(m_pageLayoutControl==null11m_mapControl==null)

thrownewException("ControlsSynchronizer::ActivateMap:\r\nBtherMapControlor

PageLayoutControlarenotinitialized!");

〃缓存当前PageLayout的CurrentTool

if(m_pageLayoutControl.CurrentTool!=null)

m_pageLayoutActiveTool=m_pageLayoutControl.CurrentTool;

〃解除PagleLayout

m_pageLayoutControl.ActiveView.Deactivate();

〃激活MapControl

m_mapControl.ActiveView.Activate(m_mapControl.hWnd);

〃将之前MapControl最后使用的tool,作为活动的tool,赋给MapControl的CurrentTool

if(m_mapActiveTool!=null)

m_mapControl.CurrentTool=m_mapActiveTool;

mJsMapCtrlactive=true;

〃为每•个的frameworkcontrols,设置Buddycontrol为MapControl

this.SetBuddies(m_mapControl.Object);

)

catch(Exceptionex)

(

thrownewException(string.Format("ControlsSynchronizer::ActivateMap:\r\n{0}",

ex.Message));

)

)

///<summary>

III激活F^gleLayoutControl并减活MapCotrol

///</summary>

publicvoidActivatePagel_ayout()

{

try

(

if(m_pageLayoutControl==null||m_mapControl==null)

thrownewException("ControlsSynchronizer::ActivatePageLayout:\r\nBther

MapControlorPageLayoutControlarenotinitialized!");

〃缓存当前MapControl的CurrentTool

if(m_mapControl.CurrentTool!=null)m_mapActiveTool=m_mapControl.CurrentTool;

〃解除MapControl

m_mapControl.ActiveView.Deactivate();

〃激活PageLayoutControl

m_pageLayoutControl.ActiveView.Activate(m_pageLayoutControl.hWnd);

〃将之前PageLayoutControl最后使用的tool,作为活动的tool,赋给PageLayoutControlW

CurrentTool

if(mjDageLayoutActiveTool!=null)

m_pageLayoutControl.CurrentTool=mjDageLayoutActiveTool;

m_lsMapCtrlactive=false;

〃为每一个的frameworkcontrols,设置Buddycontrol为PageLayoutControl

this.SetBuddies(m_pageLayoutControl.Object);

)

catch(Exceptionex)

(

thrownew

Exception(string.Format(,'OontrolsSynchronizer::ActivatePageLayout:\r\n{0}",ex.Message));

)

}

///<summary>

///给予一个地图,置换PageLayoutControl和MapControl的focusmap

///</summary>

///<paramname="newMap"></param>

publicvoidReplaceMap(IMapnewMap)

{

if(newMap==null)

thrownewException("ControlsSynchronizer::ReplaceMap:\r\nNewmapforreplacement

isnotinitialized!");

if(mjDageLayoutControl==null||m_mapControl==null)

thrownewException("Cbntrols丽chronizer::ReplaceMap:\r\nBtherMapControlor

PageLayoutControlarenotinitialized!”);

//createanewinstanceofIMapscollectionwhichisneededbythePageLayout

〃创建•个PageLayout需要用到的,新的IMapscollection的实例

IMapsmaps=newMaps();

//addthenewmaptotheMapscollection

〃把新的地图加到Mapscollection里头去

maps.Add(newMap);

boolblsMapActive=mJsMapCtrlactive;

//callreplacemaponthePageLayoutinordertoreplacethefocusmap

//wemustcallActivatePageLayout,sinceitisthecontrolwecall'ReplaceMaps,

〃调用PageLayout的replacemap来置换focusmap

〃我们必须调用ActivatePageLayout,画为它是那个我们可以调用"ReplaceMaps"的Control

this.ActivatePageLayout();

m_pageLayoutControl.PageLayout.ReplaceMaps(maps);

//assignthenewmaptotheMapControl

〃把新的地图赋给MapControl

m_mapControl.Map=newMap;

//resettheactivetools

〃重设activetools

m_pageLayoutActiveTool=null;

m_mapActiveTool=null;

//makesurethatthelastactivecontrolisactivated

〃确认之前活动的control被激活

if(blsMapActive)

(

this.ActivateMap();

m_mapControl.ActiveView.Ftefresh();

)

else

{

this.ActivatePageLayout();

m_pageLayoutControl.ActiveView.Refresh();

)

}

///<summary>

///bindtheMapControlandPageLayoutControltogetherbyassigninganewjointfocusmap

///指定共同的Map来把MapControl和PageLayoutControl绑在•起

///</summary>

///<paramname="mapControl'S</param>

///<paramname="pageLayoutControl"></param>

///<paramname="activateMapFrst">trueiftheMapControlsupposedtobeactivatedfirst,ill

果MapControl被首先激活,则为truev/param>

publicvoidBindControls(IMapControl3mapControl,IPageLayoutControlPageLayoutControl,

boolactivateMapFirst)

(

if(mapControl==null||PageLayoutControl==null)

thrownewException("ControlsSynchronizer::BindControls:\r\nEtherMapControlor

PageLayoutControlarenotinitialized!");

m_mapControl=MapControl;

m_pageLayoutControl=PageLayoutControl;

this.BindControls(activateMapFirst);

)

///<summary>

///bindtheMapControlandPageLayoutControltogetherbyassigninganewjointfocusmap

///指定共同的Map来把MapControl和PageLayoutControl绑在一起

///</summary>

///<paramname="activateMapFrst">trueiftheMapControlsupposedtobeactivatedfirst,Joi

果MapControl被首先激活,则为true</param>

publicvoidBindControls(boolactivateMapFrst)

(

if(m_pageLayoutControl==null||m_mapControl==null)

thrownewException("ControlsSynchronizer::BindControls:\r\nEtherMapControlor

PageLayoutControlarenotinitialized!");

//createanewinstanceofIMap

〃创造IMap的一个实例

IMapnewMap=newMapQass();

newMap.Name="Map";

//createanewinstanceofIMapscollectionwhichisneededbythePageLayout

〃创造一个新的IMapscollection的实例,这是PageLayout所需要的

IMapsmaps=newMaps();

//addthenewMapinstancetotheMapscollection

〃把新的Map实例j赋给Mapscollection

maps.Add(newMap);

//callreplacemaponthePageLayoutinordertoreplacethefocusmap

//痼用PageLayout的replacemap来置换focusmap

m_pageLayoutControl.PageLayout.ReplaceMaps(maps);

//assignthenewmaptotheMapControl

〃把新的map赋给MapControl

m_mapControl.Map=newMap;

//resettheactivetools

〃重设activetools

m_pageLayoutActiveTool=null;

m_mapActiveTool=null;

//makesurethatthelastactivecontrolisactivated

〃确定最后活动的control被激活

if(activateMapFrst)

this.ActivateMap();

else

this.ActivateF^geLayout();

}

///<summary>

///bypassingtheapplication'stoolbarsandTOCtothesynchronizationclass,itsavesyouthe

///managementofthebuddycontroleachtimetheactivecontrolchanges.Thismethodads

theframework

///controltoanarray;oncetheactivecontrolchanges,theclassiteratesthroughthearrayand

///callesSetBuddyControloneachofthestoredframeworkcontrol.

Ill</summary>

///<paramname="control"></param>

publicvoidAddFrameworkControl(objectcontrol)

(

if(control==null)

thrownewException("ControlsSynchronize匚:AddFrameworkControl:\r\nAddedcontrolis

notinitialized!");

m_frameworkControls.Add(control);

)

///<summary>

///Removeaframeworkcontrolfromthemanagedlistofcontrols

///</summary>

///<paramname="control's</param>

publicvoidFtemoveFrameworkControl(objectcontrol)

{

if(control==null)

thrownewException("ControlsSynchronizer::RemoveFrameworkControl:\r\nControlto

beremovedisnotinitialized!,^);

m_frameworkControls.Remove(control);

r

///<summary>

///Removeaframeworkcontrolfromthemanagedlistofcontrolsbyspecifyingitsindexinthe

list

///</summary>

///<paramname="index's</param>

publicvoidRemoveFrameworkControlAt(intindex)

{

if(m_frameworkControls.Count<index)

thrownewException("ControlsSynchronizer::RemoveFrameworkControlAt:\r\nlndexis

outofrange!'*);

m_frameworkControls.FtemoveAt(index);

r

///<summary>

///whentheactivecontrolchanges,theclassiteratesthroughthearrayoftheframework

controls

///andcallesSetBuddyControloneachofthecontrols.

///</summary>

///<paramname="buddyn>theactivecontrol</param>

privatevoidSetBuddies(objectbuddy)

(

try

(

if(buddy==null)

thrownewException("ControlsSynchronizer::SetBuddies:\r\nTargetBuddyControlis

notinitialized!*');

foreach(objectobjinm_frameworkControls)

(

if(objisIToolbarControl)

(

<(IToolbarControl)obj).SetBuddyControl(buddy);

)

elseif(objisITOCControl)

{

((ITOCControl)obj).SetBuddyControl(buddy);

)

}

)

catch(Exceptionex)

{

thrownewException(string.Format("ControlsSynchronizer::SetBuddies:\r\n{0}”,

ex.Message));

)

}

#endregion

)

)

摘要:在ArcMap中,能够很方面地进行M叩View和LayoutView两种视图的切换,而且

二者之间的数据是同步显示的。关于两种视图同步的实现方法有多种,可以使用ObjectCopy

对象进行数据硬拷贝,而比较简单的方法莫过于二者共享一份地图了,这也是最常用的方法。

2、新建Maps类

在同步类中,要用到Maps类,用于管理地图对象。与新建同步类

ControlsSynchronizer类似,我们新建Maps类,其所有代码如下所示:

usingSystem;

usingSystem.Collections;

using^stem.Collections.Generic;

using耳stem.Text;

using^stem.Runtime.InteropServices;

usingESRI.ArcGIS.Carto;

namespace_sdnMap

(

[Guid(,,f27d8789-fbbc-4801-be78-0e3cd8fff9d5")]

[Qasslnterface(QasslnterfaceType.None)]

[Progld("_sdnMap.Maps")]

publicclassMaps:IMaps,IDisposable

(

//classmember-usinginternallyanArrayListtomanagetheMapscollection

privateArrayListm_array=null;

#regionclassconstructor

publicMaps()

{

m_array=newArrayList();

)

#endregion

#regionIDisposableMembers

///<summary>

///Disposethecollection

///</summary>

publicvoidDispose()

(

if(m_array!=null)

{

m_array.aear();

m_array=null;

)

}

#endregion

#regionIMapsMembers

///<summary>

///RemovetheMapatthegivenindex

///</summary>

///<paramname="Index"></param>

publicvoidRemoveAt(intIndex)

{

if(Index>m_array.Count||Index<0)

thrownewException("Maps::FtemoveAt:\r\nlndexisoutofrange!*');

m_array.RemoveAt(lndex);

)

///<summary>

///ResettheMapsarray

///</summary>

publicvoidReset()

(

m_array.Qear();

}

///<summary>

IllGetthenumberofMapsinthecollection

///</summary>

publicintCount

{

get

{

returnm_array.Count;

)

)

///<summary>

///ReturntheMapatthegivenindex

///</summary>

///<paramname="Index',></param>

///<returns></returns>

publicIMapgetjtern(intIndex)

{

if(Index>m_array.Count11Index<0)

thrownewException("Maps::get_ltem:\r\nIndexisoutofrange!");

returnm_array[Index]asIMap;

)

///<summary>

///RemovetheinstanceofthegivenMap

///</summary>

///<paramname="Map"></param>

publicvoidRemove(IMapMap)

(

m_array.Remove(Map);

)

///<summary>

///CreateanewMap,addittothecollectionandreturnittothecaller

III</summary>

///<returnsx/returns>

publicIMapCreate()

{

IMapnewMap=newMapQass();

m_array.Add(newMap);

returnnewMap;

}

///<summary>

IIIAddthegivenMaptothecollection

///</summary>

///<paramname=*'Map"></param>

publicvoidAdd(IMapMap)

{

if(Map==null)

thrownewException("Maps::Add:\r\nNewMapismotinitialized!1');

m_array.Add(Map);

}

#endregion

)

)

3、新建打开文档类OpenNewMapD

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论