AE+C#开发Word格式.docx
《AE+C#开发Word格式.docx》由会员分享,可在线阅读,更多相关《AE+C#开发Word格式.docx(37页珍藏版)》请在冰豆网上搜索。
设置ToolbarControl和TOCControl的绑定控件。
处理窗口缩放。
向ToolbarControl添加ArcGISEngine命令和工具。
创建弹出式菜单
在TOCControl中管理标签编辑
在MapControl中绘制图形。
为MapControl、PageLayoutControl和ToolbarControl创建定制工具。
用户化ToolbarControl。
在Windows操作系统中部署应用。
二、概述
本方案使用微软VisualStudio.NET开发环境加以实现,并使用了ESRIinterop程序集(InteropAssemblies),它服务于被放置在.NET窗体上的、位于.NET窗体控件(.NETWindowsControls)中的ArcGIS控件,这些程序集在托管的.NET代码和非托管的COM代码之间起了桥梁作用。
对COMArcGIS控件(COMArcGISControls)成员的引用都要经过Interop程序集,然后到达实际的COM对象。
同样,也从COM对象经过Interop程序集到达.NET应用程序。
每个ArcGISEngine控件具有方法、属性与事件,它们能够被控件嵌入的容器(如,.NET窗体)访问。
每个控件对象及其功能可以与其他ESRIArcObjects和自定义控件组合使用,创建用户化的客户应用程序。
此方案是使用了C#和VisualBasic.NET两种语言创建,但以下技术实现集中倾向于C#方案。
许多开发者可能会感觉用VisualBasic.NET更舒服,那是因为他们已经比较熟悉VisualBasic6.0代码,然而,对于Java和C++程序员来说,他们将会觉得对C#程序语言的语法更熟悉。
无论你使用哪种开发环境,对于使用ArcGIS控件的好坏既依赖于你的编程环境技术,也依赖于你所掌握的ArcObjects技术。
在本方案中,使用ToolbarControl、TOCControl、PageLayoutControl和MapControl来为应用程序提供用户界面。
这些ArcGIS控件与其他ArcObjects和ArcGISEngine命令被开发者一起使用,用来创建一个GIS视窗应用。
三、设计
此方案在设计时,首先强调了ArcGIS控件如何互相之间进行交互,其次,向开发者解释说明了ArcGIS控件对象模型的一部分。
每个.NETArcGISEngine控件包含有一套能够被嵌入其内的窗口即时访问的属性页。
这些属性些为控件属性和方法的选择提供了捷径,并且允许开发者不写任何代码即可创建一个应用程序。
本方案并没有使用属性页,而是采用写代码的方式建立应用程序。
关于属性页的更进一步的信息,请参考ArcGIS开发帮助(ArcGISDeveloperHelp)。
四、条件需求
要顺利地完成以下方案,你需要以下条件(对于部署的需求将在后续的部署章节涉及到):
安装具有授权文件的ArcGISEngine开发工具包(DeveloperKit),使之能够用于开发。
安装有微软VisualStudio.NET2003开发环境和微软.NETFramework1.1及其相应协议。
熟悉微软Windows操作系统和MicrosoftVisualStudio.NET的工作知识,会用C#或VisualBasic.NET编程语言。
当然,此方案中提供了一些如何在MicrosoftVisualStudio.NET中使用ArcGIS控件的信息,但它不能替代对开发环境的培训。
不需要对ESRI其它软件有足够的经验,但如果以前对ArcObjects有所接触并对ArcGIS应用(如,ArcCatalog,ArcMap)有一个基本了解,则对于开发更有利。
访问来自本方案的样例数据和代码,它位于:
本方案中使用到的控件和库如下:
AxMapControl
AxTOCControl
AxPageLayoutControl
AxToolbarControl
ESRI.ArcGIS.Carto
ESRI.ArcGIS.System
ESRI.ArcGIS.Display
ESRI.ArcGIS.SystemUI
ESRI.ArcGIS.Geometry
ESRI.ArcGIS.Utility
esriMapControl
esriTOCControl
esriPageLayoutControl
esriToolbarControl
五、实现
下面的实现过程中提供了你成功完成方案所需所有代码。
假设你对于开发环境已经有了一定的知识,所以下面没有逐步地详细介绍如何用MicrosoftVisualStudio.NET开发应用。
(一)加载ArcGIS控件
在你为应用程序编写代码之前,应该先将应用程序将用到的ArcGIS控件和其他ArcGISEngine库引用装载到开发环境之中。
1.
启动VisualStudio.NET,并从新建项目对话框中创建一个新的VisualC#“Windows应用程序”项目。
2.
将项目命名为“Controls”,并选择位置存取该项目。
3.
在“工具箱”的“Windows窗体”标签栏中单击右键,然后从上下文菜单中选择“添加/移除项(I)…”。
4.
在“自定义工具箱”中选择“.NETFramework组件”,并复选“AxMapControl”,“AxPageLayoutControl”,“AxTOCControl”和“AxToolbarControl”,单击确定按钮。
这样所选择的控件将显示在工具箱的Windows窗体标签栏中。
5.
单击项目菜单,并选择“添加引用(R)…”。
6.
在添加引用对话框中,双击“ESRI.ArcGIS.Carto”,“ESRI.ArcGIS.Display”,“ESRI.ArcGIS.Geometry”,“ESRI.ArcGIS.System”,“ESRI.ArcGIS.SystemUI”,“ESRI.ArcGIS.Utility”。
单击确定。
对于ESRI.NET程序集,将通过具体实例来说明,并使用.NET框架提供的COM传送服务从你的C#项目中调用ESRI对象库中的实体对象。
(二)在容器中嵌入ArcGIS控件
在你能够访问每个控件的事件、属性和方法之前,需要将控件嵌入到.NET容器中。
一旦将控件嵌入窗体内,它们将图形化应用程序的用户界面。
在设计模式下打开.NET窗体。
双击工具箱Windows标签栏中的AxMapControl控件,将MapControl加入到窗体上。
再将AxPageLayoutControl、AxTOCControl和AxToolbarControl如上添加到窗体中。
重新调整窗体上各个控件的大小和位置,调整结果如下所示。
在窗体上双击显示窗体代码窗口,在代码窗口的顶部增加“using”命令:
usingSystem;
usingSystem.Windows.Forms;
//ArcGISEngine引用
usingESRI.ArcGIS.SystemUI;
usingESRI.ArcGIS.Carto;
usingESRI.ArcGIS.Display;
usingESRI.ArcGIS.Geometry;
usingESRI.ArcGIS.esriSystem;
usingESRI.ArcGIS.ToolbarControl;
usingESRI.ArcGIS.TOCControl;
需注意C#是区分大小写的。
当你键入“ESRI.”时,智能敏感的自动完成功能将允许你通过按Tab键完成下一节。
(三)加载Map文档到MapControl与PageLayoutControl
单独的数据层或者使用ArcMap、ArcGIS桌面应用程序产生的图形文档,能够被加载到MapControl和PageLayoutControl中。
你可以加载样例图形文档,或者加载你自己的图形文档。
后面你将增加一个浏览图形文档的对话框。
选择Form_Load事件,并输入下列代码(如果你使用你自己的图形文档,要替换为正确的文件名):
//使用相对路径向PageLayoutControl加载一个图形文档
stringfilename=@"
..\..\..\..\..\..\..\..\Data\\ArcGIS_Engine_Developer_Guide\\gulfofst.lawrence.mxd"
;
if(axPageLayoutControl1.CheckMxFile(filename))
{
axPageLayoutControl1.LoadMxFile(filename,"
"
);
}
在设计模式显示窗体并从属性窗选择axPageLayoutControl1控件,显示axPageLayoutControl事件。
在OnPageLayoutReplaced事件上双击向代码窗口添加该事件的处理函数。
在axPageLayoutControl1_OnPageLayoutReplaced事件中键入以下向MapControl加载样例图形文档的代码。
当文档被装载入PageLayoutControl时OnPageLayoutReplaced事件将会被触发。
privatevoidaxPageLayoutControl1_OnPageLayoutReplaced(objectsender,ESRI.ArcGIS.PageLayoutControl.IPageLayoutControlEvents_OnPageLayoutReplacedEvente)
//加载同样的文档到MapControl
axMapControl1.LoadMxFile(axPageLayoutControl1.DocumentFilename,null,null);
//设置MapControl显示范围至数据的全局范围
axMapControl1.Extent=axMapControl1.FullExtent;
}
(四)设置ToolbarControl与TOCControl控件的绑定控件
对于此应用程序,TOCControl和ToolbarControl控件将与PageLayoutControl相互协作,而不是MapControl。
为此PageLayoutControl必须设置为绑定控件。
TOCControl使用绑定的ActiveView显示图形、图层和符号。
而位于ToolbarControl上的任何命令、工具或菜单项会受绑定控件的显示影响。
在Form_Load事件中的加载文档代码的后面键入以下红色部分内容:
privatevoidForm1_Load(objectsender,System.EventArgse)
//使用相对路径向PageLayoutControl加载一个图形文档
stringfilename=@"
if(axPageLayoutControl1.CheckMxFile(filename))
{
axPageLayoutControl1.LoadMxFile(filename,"
}
//设置绑定控件
axTOCControl1.SetBuddyControl(axPageLayoutControl1);
axToolbarControl1.SetBuddyControl(axPageLayoutControl1);
生成并运行应用程序。
图形文档被加载到PageLayoutControl,并且TOCControl列出了图形文档中的数据图层。
使用TOCControl通过复选和取消复选框控制图层的可见性。
默认地,图形文档的焦点图(focusmap)被装入MapControl控件。
在这种当前情况下,ToolbarControl控件显示是空的,因为没有为它添加任何命令。
试着缩放窗体,你会注意到控件不会改变尺寸。
(五)处理窗口缩放
当窗口在运行时进行缩放时,PageLayoutControl和MapControl不会自动改变自身的尺寸。
要改变控件的尺寸以便它们总是与匹配窗口的范围,你必须将控件锚定在窗口上。
如果PageLayoutControl或MapControl包含大量的数据,在窗口缩放期间重绘这些数据显得相当重要。
为了提高执行效率,你可以禁止数据重绘直到缩放操作完成后再重绘之。
在缩放时,可以用一个可伸缩的位图来替代重绘数据。
在设计模式显示窗体并从属性窗口中选择axPageLayoutControl1。
单击Anchor属性,将axPageLayoutControl1锚定在窗体的顶、左、底和右部。
锚定axMapControl控件到窗体的顶、左和底部。
在Form_Load事件的开头增加以下代码:
//当缩放时禁止重绘
this.SetStyle(ControlStyles.EnableNotifyMessage,true);
向类增加以下常量:
publicclassForm1:
System.Windows.Forms.Form
//……
privateconstintWM_ENTERSIZEMOVE=0x231;
privateconstintWM_EXITSIZEMOVE=0x232;
//……
向重载的OnNotifyMessage方法中增加下列代码:
protectedoverridevoidOnNotifyMessage(Messagem)
base.OnNotifyMessage(m);
//以下为手工添加的代码
if(m.Msg==WM_ENTERSIZEMOVE)
axMapControl1.SuppressResizeDrawing(true,0);
axPageLayoutControl1.SuppressResizeDrawing(true,0);
elseif(m.Msg==WM_EXITSIZEMOVE)
axMapControl1.SuppressResizeDrawing(false,0);
axPageLayoutControl1.SuppressResizeDrawing(false,0);
生成并运行应用程序,试着缩放窗口。
禁止缩放时重画方法是通过检查发送到窗体的Windows消息工作的。
当窗口开发缩放时,Windows发送WM_ENTERSIZEMOVE窗口消息。
此时,我们禁止在MapControl和PageLayoutControl上绘制图形,而是使用“stretchybitmap”绘制。
当Windows发送WM_EXITSIZEMOVE消息时,窗体结束缩放,这时我们全部重绘新的范围。
(六)向ToolbarControl增加命令
ArcGISEngine提供了120多个命令和工具,它们与MapControl、PageLayoutControl和ToolbarControl直接相互协作。
这些命令和工具为你提供了大量的经常使用的地图导航、图形管理、地物选择等方面的GIS功能。
现在将在你的应用程序中增加这些命令和工具的一部分。
在Form_Load事件中的加载文档代码之前添加如下代码。
//增加打开档命令
stringprogID;
progID="
esriControlToolsGeneric.ControlsOpenDocCommand"
axToolbarControl1.AddItem(progID,-1,-1,false,0,
esriCommandStyles.esriCommandStyleIconOnly);
//增加PageLayout导航命令
esriControlToolsPageLayout.ControlsPageZoomInTool"
axToolbarControl1.AddItem(progID,-1,-1,true,0,
esriControlToolsPageLayout.ControlsPageZoomOutTool"
esriControlToolsPageLayout.ControlsPagePanTool"
esriControlToolsPageLayout.ControlsPageZoomWholePageCommand"
esriControlToolsPageLayout.ControlsPageZoomPageToLastExtentBackCommand"
esriControlToolsPageLayout.ControlsPageZoomPageToLastExtentForwardCommand"
//增加地图导航命令
esriControlToolsMapNavigation.ControlsMapZoomInTool"
esriControlToolsMapNavigation.ControlsMapZoomOutTool"
esriControlToolsMapNavigation.ControlsMapPanTool"
esriControlToolsMapNavigation.ControlsMapFullExtentCommand"
axToolbarControl1.Add