《ArcGISEngine+C实例开发教程》_第1页
《ArcGISEngine+C实例开发教程》_第2页
《ArcGISEngine+C实例开发教程》_第3页
《ArcGISEngine+C实例开发教程》_第4页
已阅读5页,还剩93页未读 继续免费阅读

下载本文档

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

文档简介

第一讲:桌面GIS应用程序框架的建立讲主要是使用MapControkPageLayoutControl>ToolbarControLTOCContro!四个捽件建立起基本的桌面GIS应用程序框架。最终成果预览如下:1、新建项目启动VS2005,选择“文件|新建|项目”,在项目类型中选择VisualC#,再选择Windows应用程序模板,输入名称“3sdnMap',点击确定。在解决方案管理器中将“Forml.cs”重命名为“3sdnMap.cs”,在设计视图中,选中窗体,将其属性中的“Text”改为“3sdnMap”〇2、添加控件选择工具箱中的“菜单和工具栏|MenuStrip”,将其拖入窗体。选择工具箱中的“ArcGISWindowsForms”节,将aToolbarControlM控件拖入窗体,并将其属性中的Dock设置为Top。选择工具箱中的“菜单和工具栏|StatusStrip”,将其拖入到窗体。选择工具箱中的“容器ドplitContainer”容器拖入窗体,并将其属性中的Dock设置为Fill。将TabContro!控件拖入Panell,将Alignment属性设置为Bottom,Dock属性设置为F川。点击TabPages属性右边的按钮,弹出TabPage集合编辑器,将tabPage!的Name设置为tabPageLayer,Text设置为图层,将tabPage2的Name设置为tabPageProperty,Text设置为属性。如下所示。选择“图层”选项卡,拖入TOCControl控件,设置Dock属性为FilL选择“属性”选项卡,拖入PropertyGrid控件(“工具箱|所有Windows窗体|PropertyGrid”)'设置Dock属性为FilL拖入TabContro!控件到Panel2,设置Dock属性为Fill。并上述类似的方法,将两个选项卡的Name和Text分别设置为:(tabPageMap、地图),(tabPageLayout,制版)〇选择“地图”选项卡,拖入MapControl控件,设置Dock属性为Fill。选择“制版”选项卡,拖入PageLayoutControl控件,设置Dock属性为Fill=最后将Licensecontro!控件拖入到窗体的任意地方。按F5编译运行,可以看到刚才布局好的程序界面了。3、控件绑定通过以上步骤添加的控件还只是单独存在,而我们的程序需要各控件间协同工作,因此要进行控件绑定。分别右击Toolbarcontrol、TOCControl控件,将Buddy设置为axMapControll,如下图所示。

这样,工具条和图层控件就与地图控件关联了。4、添加工具此时,工具条中还没有任何工具,添加的方法也很简单。右击Toolbarcontrol,选择“属性|Items",点击Add,选择Commands选项卡中的Generic,双击Open、SaveAs、Redo>Undo即可将相应工具添加到工具条。常见的工具有:MapNavigation中的导航工具,MapInquiry中的査询工具,FeatureSelection中的选择工具,你可以根据需要酌情添加工具。5、编译运行按F5即可编译运行程序,至此桌面GIS应用程序框架基本框架已经搭建好了,你可以通过工具条的工具打开地图文档,浏览地图了,效果如开篇所示。下ー讲中将大家带来的是菜单的添加及其实现,敬请关注3SDN.NET。第二讲菜单的添加及其实现在这ー讲中,主要讲解菜单的添加和实现。1、添加菜单在设计视图中,单击菜单栏,会出现“请在此处键入”的提示,单击提示就可以键入菜单名称,如“文件”,再单击“文件”,即可输入其下拉子菜单,如下所示:Tips:每创建一个菜单,请在其属性面板中设置Name属性,而且不要为中文,因此Name值将是此菜单响应函数的函数名的一部分,带中文的函数名,总是不好吧。本讲中,我们将添加新建(New)、打开(Open)、添加数据(AddData)、保存(Save)、另存为(SaveAs)、退出(Exit)这些菜单,()内为相应的Name属性值。Tips:你可以在属性面板中的Text属性中,把菜单名设置为中英文形式,如“打开Open”,带下划线的〇表示此项菜单的快捷键是字母〇,设置方法是在相应字母前加上“&”字符,如“打开&Open”。但这种快捷键只在打开此下拉菜单时オ有效,即当你单击“文件”菜单弹出下拉菜单时,按下字母〇就可以定位到“打开”菜单。还有一种在程序运行时都有效的全局快捷键,可以在属性面板中的“ShortCutKeys”中设置。你还可以在属性面板中的Image属性中设置你喜欢的菜单图标。单击!mage那•行右边的按钮,弹出如下菜单。选择“项目资源文件”,再单击导入就可以选择你的图标了。最终效果如下所示。

ontrol[文阵]ontrol'J新建New/打开Open用添加数据AddData©|保存Save屯另存为SaveAs轴退出Exitj 二地图a制版ArcGIS地图a制版ArcGISIName:<2、实现相关菜单首先定义指针(写在publicpartialclassForml:Form下面即可):privateESRI.ArcGIS.Controls.lMapControl3m_mapControl=null;privateESRI.ArcGIS.Controls.lPageLayoutControl2m_pageLayoutControl=null;privateIMapDocumentpMapDocument;若以上指针无效,请添加以下引用:usingESRLArcGIS.Carto;usingESRLArcGIS.Controls;usingESRI.ArcGIS.esriSystem;usingESRLArcGIS.Display;usingESRI.ArcGIS.Geometry;usingESRLArcGIS.SystemUI;在设计视图中的属性面板中,选择Forml,即主窗体,单击事件按钮(闪电形状的那个按钮),打到“Load”事件并双击,添加此事件。在Forml_Load函数中初始化这些指针://取得MapControl和PageLayoutControl的引用m_mapControl=(IMapControl3)this.axMapControll.Object;m_pageLayoutControl=(IPageLayoutControl2)this.axPageLayoutControll.Object;依次双击每个菜单项,添加菜单响应函数。实现代码如下:III<summary>II!新建地图命令III</summary>///<paramname="sender"x/param>///<paramname=He"></param>privatevoidNew_Click(objectsender,EventArgse)(〃本命令涉及到MapControl和PageLayoutControl同步问题,将在下ー讲中实现)HI<summary>III打开地图文档Mxd命令III</summary>///<paramname=Hsender"></param>///<paramname=He"x/param>privatevoidOpen_Click(objectsender,EventArgse)(〃本命令涉及到MapControl和PageLayoutControl同步问题,将在下ー讲中实现}Ill添加数据命令III</summary>///<paramname=Hsender"></param>///<paramname=He"></param>privatevoidAddData_Click(objectsender,EventArgse)(intcurrentLayerCount=this.axMapControll.LayerCount;ICommandpCommand=newControlsAddDataCommandClass();pCommand.OnCreate(this.axMapControll.Object);pCommand.OnClick();)///<summary>III保存地图文档命令///</summary>///<paramname=Hsender"></param>///<paramname=He"x/param>privatevoidSave_Click(objectsender,EventArgse)(1Z首先确认当前地图文档是否有效if(null!=m_pageLayoutControl.DocumentFilename&&m_mapControl.CheckMxFile(m_pageLayoutControl.DocumentFilename))/Z创建一个新的地图文档实例IMapDocumentmapDoc=newMapDocumentClass();/Z打开当前地图文档mapDoc.Openfm_pageLayoutControl.DocumentFilename,string.Empty);/Z用PageLayout中的文档替换当前文档中的PageLayout部分mapDoc.ReplaceContents((IMxdContents)m_pageLayoutControl.PageLayout);/Z保存地图文档mapDoc.SavefmapDoc.UsesRelativePaths,false);mapDoc.Close();)}///<summary>II!另存为地图文档命令III</summary>///<paramname="sender"x/param>///<paramname=ne"></param>privatevoidSaveAs_Click(objectsender,EventArgse)(/Z调用另存为命令ICommandcommand=newControlsSaveAsDocCommandClass();command.OnCreate(m_controlsSynchronizer.ActiveControl);command.OnClick();)//Z退出程序III</summary>III<paramname="sender"x/param>III<paramname="e"x/param>privatevoidExit_Click(objectsender,EventArgse)(Application.Exit();}3、编译运行按F5编译运行程序。也许你会发现,菜单命令的实现方式都是类型的。没错,在AE9.2中,内置了许多常用的Command和Tool,如ControlsAddDataCommandClassヽControlsMapZoomlnToolClassヽControlsMapPanToolClass等等,这些内置对象在ESRLArcGIS.Controls命名空间中,你可以对象浏览器中查看。而且这些内置对象的调用方式都类似,如下所示:/Z定义ICommandcommand=newControlsSaveAsDocCommandClass();/Z创建command.OnCreate(m_controlsSynchronizer.ActiveControl);II调用command.OnClick();希望你可以举一反三,去实现更多的你想要的功能。第三讲MapControI与PageLayoutContro!同步在ArcMap中,能够很方面地进行MapView和LayoutView两种视图的切换,而且二者之间的数据是同步显示的。关于两种视图同步的实现方法有多种,可以使用Objectcopy对象进行数据硬拷贝,而比较简单的方法莫过于二者共享一份地图了,这也是最常用的方法。1、新建同步类ControlsSynchronizer在解决方案面板中右击项目名,选择“添加|类”,在类别中选择“VisualC#项目项”,在模板中选择“类”,输入类名“ControlsSynchronizer.cs”,将以下代码覆盖自动生成的代码:usingSystem;usingSystem.Drawing;usingSystem.Collections;usingSystem.ComponentModel;usingSystem.Windows.Forms;usingSystem.10;usingSystem.Runtime.InteropServices;usingESRLArcGIS.esriSystem;usingESRLArcGIS.Carto;usingESRI.ArcGIS.Controls;usingESRI.ArcGIS.SystemUI;namespace_sdnMap{///<summary>///ThisclassisusedtosynchronizeagvenPageLayoutControlandaMapControl.///Wheninitialized,theusermustpassthereferenceofthesecontroltotheclass,bindHIthecontroltogetherbycalling'BindControls'whichinturnsetsajoinedMapreferenced///bybothcontrol;andsetallthebuddycontrolsjoinedbetweenthesetwocontrols.IllWhenalternatingbetweentheMapControlandPageLayoutControl,youshouldactivatethevisiblecontrol///anddeactivatetheotherbycallingActivateXXX.IllThiscalssislimitedtoasituationwherethecontrolsarenotsimultaneouslyvisible.///</summary>publicclassControlsSynchronizer#regionclassmembersprivateIMapControl3m_mapControl=null;privateIPageLayoutControl2m_pageLayoutControl=null;privateIToolm_mapActiveTool=null;privateIToolm_pageLayoutActiveTool=null;privateboolm_lsMapCtrlactive=true;privateArrayListm_frameworkControls=null;#endregionftregionconstructor///<summary>//Z默认构造函数///</summary>publicControlsSynchronizer()(〃初始化ArrayListm_frameworkControls=newArrayList();}///<summary>III构造函数III</summary>///<paramname="mapControl"></param>///<paramname="pageLayoutContror,x/param>publicControlsSynchronizer(IMapControl3mapControl,IPageLayoutControl2pageLayoutControl):this()(〃为类成员赋值m_mapControl=mapControl;m_pageLayoutControl=pageLayoutControl;}#endregion#regionproperties///<summary>///取得或设置MapControl///</summary>publicIMapControl3MapControl(get{returnm_mapControl;}set{m_mapControl=value;}}///<summary>///取得或设置PageLayoutControlIII</summary>publicIPageLayoutControl2PageLayoutControl(get{returnm_pageLayoutControl;}set{m_pageLayoutControl=value;}}///<summary>III取得当前ActiveView的类型///</summary>publicstringActiveViewTypegetif(m_lsMapCtrlactive)return"MapControl";elsereturn"PageLayoutControl',;})///<summary>//Z取得当前活动的Control///</summary>publicobjectActiveControl(get(if(m_mapControl==null11m_pageLayoutControl==null)thrownewException("ControlsSynchronizer::ActiveControl:\r\nEitherMapControlorPageLayoutControlarenotinitialized!");if(mJsMapCtrlactive)returnm_mapControl.Object;elsereturnm_pageLayoutControLObject;})#endregion#regionMethods///<summary>///激活MapControl并解除thePagleLayoutControl///</summary>publicvoidActivateMap()(try(if(m_pageLayoutControl==null11m_mapControl==null)thrownewException("ControlsSynchronizer::ActivateMap:\r\nEitherMapControlorPageLayoutControlarenotinitialized!");〃缓存当前PageLayout的CurrentToolif(m_pageLayoutControl.CurrentTool!=null)m_pageLayoutActiveTool=m_pageLayoutControl.CurrentTool;〃解除PagleLayoutm_pageLayoutControl.ActiveView.Deactivate();〃激活MapControlm_mapControl.ActiveView.Activate(m_mapControl.hWnd);〃将之前MapControl最后使用的tool,作为活动的tool,赋给MapControl的CurrentToolif(m_mapActiveTool!=null)m_mapControl.CurrentTool=m_mapActiveTool;mJsMapCtrlactive=true;〃为每ー个的frameworkcontrols,iSSBuddycontrol为MapControlthis.SetBuddies(m_mapControl.Object);}catch(Exceptionex)(thrownewException(string.Format(,,ControlsSynchronizer::ActivateMap:\r\n{0},,/ex.Message));})HI<summary>///激活PagleLayoutContro!并减活MapCotrol///</summary>publicvoidActivatePageLayout()(try(if(m_pageLayoutControl==null11m_mapControl==null)thrownewException("ControlsSynchronizer::ActivatePageLayout:\r\nEitherMapControlorPageLayoutControlarenotinitialized!");〃缓存当前MapContro!的CurrentToolif(m_mapControl.CurrentTool!=null)m_mapActiveTool=m_mapControl.CurrentTool;〃解除MapControlm_mapControl.ActiveView.Deactivate();〃激活PageLayoutControlm_pageLayoutControl.ActiveView.Activate(m_pageLayoutControl.hWnd);〃将之前PageLayoutControl最后使用的tool,作为活动的tool,赋给PageLayoutContro!的CurrentToolif(m_pageLayoutActiveTool!=null)m_pageLayoutControl.CurrentTool=m_pageLayoutActiveTool;m_lsMapCtrlactive=false;〃为每ー个的frameworkcontrols,设置Buddycontrol为PageLayoutControlthis.SetBuddies(m_pageLayoutControl.Object);catch(Exceptionex)(thrownewException(string.Format("ControlsSynchronizer::ActivatePageLayout:\r\n{0}",ex.Message));}}///<summary>//Z给予ー个地图,置换PageLayoutControl和MapContro!的focusmap///</summary>///<paramname="newMapK></param>publicvoidReplaceMap(IMapnewMap)(if(newMap==null)thrownewException("ControlsSynchronizer::ReplaceMap:\r\nNewmapforreplacementisnotinitialized!");if(m_pageLayoutControl==null11m_mapControl==null)thrownewException("ControlsSynchronizer::ReplaceMap:\r\nEitherMapControlorPageLayoutControlarenotinitialized!");//createanewinstanceofIMapscollectionwhichisneededbythePageLayout〃创建一个PageLayout需要用到的,新的IMapscollection的实例IMapsmaps=newMaps();//addthenewmaptotheMapscollection〃把新的地图加到Mapscollection里头去maps.Add(newMap);boolblsMapActive=mJsMapCtrlactive;//callreplacemaponthePageLayoutinordertoreplacethefocusmap//wemustcallActivatePageLayout,sinceitisthecontrolwecall'ReplaceMaps'〃调用PageLayout的replacemap来置换focusmap〃我们必须调用ActivatePageLayout,因为它是那个我们可以调用"ReplaceMaps"的Controlthis.ActivatePageLayout();m_pageLayoutControl.PageLayout.ReplaceMaps(maps);//assignthenewmaptotheMapControl〃把新的地图赋给MapControlm_mapControl.Map=newMap;//resettheactivetools〃重设activetoolsm_pageLayoutActiveTool=null;m_mapActiveTool=null;//makesurethatthelastactivecontrolisactivated〃确认之前活动的control被激活if(blsMapActive)(this.ActivateMap();m_mapControl.ActiveView.Refresh();)else(this.ActivatePageLayout();m_pageLayoutControl.ActiveView.Refresh();)}///<summary>///bindtheMapControlandPageLayoutControltogetherbyassigninganewjointfocusmap///指定共同的Map来把MapControl和PageLayoutContro!绑在ー起HI</summary>///<paramname="mapControl"x/param>///<paramname="pageLayoutControl"x/param>///<paramname="activateMapFirsゼ、trueiftheMapControlsupposedtobeactivatedfirst,如果MapControl被首先激活,则为true</param>publicvoidBindControls(IMapControl3mapControl,IPageLayoutControl2pageLayoutControl,boolactivateMapFirst)(if(mapControl==null11pageLayoutControl==null)thrownewException("ControlsSynchronizer::BindControls:\r\nEitherMapControlorPageLayoutControlarenotinitialized!");m_mapControl=MapControl;m_pageLayoutControl=pageLayoutControl;this.BindControls(activateMapFirst);}///<summary>///bindtheMapControlandPageLayoutControltogetherbyassigninganewjointfocusmap///指定共同的Map来把MapControl和PageLayoutContro!绑在ー起HI</summary>III<paramname="activateMapFirst">trueiftheMapControlsupposedtobeactivatedfirst,如果MapControl被首先激活,则为true</param>publicvoidBindControls(boolactivateMapFirst)if(m_pageLayoutControl==null11m_mapControl==null)thrownewException("ControlsSynchronizer::BindControls:\r\nEitherMapControlorPageLayoutControlarenotinitialized!");//createanewinstanceofIMap〃创造IMap的ー个实例IMapnewMap=newMapClass();newMap.Name="Map";//createanewinstanceofIMapscollectionwhichisneededbythePageLayout〃创造ー个新的IMapscollection的实例,这是PageLayout所需要的IMapsmaps=newMaps();//addthenewMapinstancetotheMapscollection〃把新的Map实例赋给Mapscollectionmaps.Add(newMap);//callreplacemaponthePageLayoutinordertoreplacethefocusmap〃调用PageLayout的replacemap来置换focusmapm_pageLayoutControl.PageLayout.ReplaceMaps(maps);//assignthenewmaptotheMapControl〃把新的map赋给MapControlm_mapControl.Map=newMap;//resettheactivetools〃重设activetoolsm_pageLayoutActiveTool=null;m_mapActiveTool=null;//makesurethatthelastactivecontrolisactivated〃确定最后活动的control被激活if(activateMapFirst)this.ActivateMap();elsethis.ActivatePageLayout();}///<summary>///bypassingtheapplication'stoolbarsandTOCtothesynchronizationclass,itsavesyouthe///managementofthebuddycontroleachtimetheactivecontrolchanges.Thismethodadstheframework///controltoanarray;oncetheactivecontrolchanges,theclassiteratesthroughthearrayand///callesSetBuddyControloneachofthestoredframeworkcontrol.///</summary>///<paramname="control"x/param>publicvoidAddFrameworkControl(objectcontrol)if(control==null)thrownewException("ControlsSynchronizer::AddFrameworkControl:\r\nAddedcontrolisnotinitialized!");m_frameworkControls.Add(control);}///<summary>///Removeaframeworkcontrolfromthemanagedlistofcontrols///</summary>///<paramname="control"x/param>publicvoidRemoveFrameworkControl(objectcontrol)(if(control==null)thrownewException("ControlsSynchronizer::RemoveFrameworkControl:\r\nControltoberemovedisnotinitialized!");m_frameworkControls.Remove(control);}///<summary>///RemoveaframeworkcontrolfromthemanagedlistofcontrolsbyspecifyingitsindexinthelistHI</summary>///<paramname="index"x/param>publicvoidRemoveFrameworkControlAt(intindex)(if(m_frameworkControls.Count<index)thrownewException("ControlsSynchronizer::RemoveFrameworkControlAt:\r\nlndexisoutofrange!");m_frameworkControls.RemoveAt(index);}///<summary>///whentheactivecontrolchanges,theclassiteratesthroughthearrayoftheframeworkcontrols///andcallesSetBuddyControloneachofthecontrols.///</summary>///<paramname="buddy">theactivecontrol</param>privatevoidSetBuddies(objectbuddy)tryif(buddy==null)thrownewException("ControlsSynchronizer::SetBuddies:\r\nTargetBuddyControlisnotinitialized!");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}"zex.Message));})#endregion}}2、新建Maps类在同步类中,要用到Maps类,用于管理地图对象。与新建同步类ControlsSynchronizer类似,我们新建一Maps类,其所有代码如下所示:usingSystem;usingSystem.Collections;usingSystem.Collections.Generic;usingSystem.Text;usingSystem.Runtime.InteropServices;usingESRLArcGIS.Carto;namespace_sdnMap([Guid("f27d8789-fbbc-4801-be78-0e3cd8fff9d5")][Classlnterface(ClasslnterfaceType.None)][Progld("_sdnMap.Maps")]publicclassMaps:IMaps,Disposable//classmember-usinginternallyanArrayListtomanagetheMapscollectionprivateArrayListm_array=null;#regionclassconstructorpublicMaps()(m_array=newArrayList();)#endregion#regionIDisposableMembers///<summary>///Disposethecollection///</summary>publicvoidDispose()(if(m_array!=null){m_array.Clear();m_array=null;}}#endregion#regionIMapsMembers///<summary>///RemovetheMapatthegivenindex///</summary>///<paramname=',lndex,,x/param>publicvoidRemoveAt(intIndex)(if(Index>m_array.Count11Index<0)thrownewException("Maps::RemoveAt:\r\nlndexisoutofrange!");m_array.RemoveAt(lndex);}///<summary>///ResettheMapsarray///</summary>publicvoidReset()m_array.Clear();///<summary>///GetthenumberofMapsinthecollection///</summary>publicintCount(get(returnm_array.Count;}}///<summary>///ReturntheMapatthegivenindexIII</summary>///<paramname="lndexH></param>///<returns></returns>publicIMapget_ltem(intIndex)(if(Index>m_array.Count11Index<0)thrownewException("Maps::get_ltem:\r\nlndexisoutofrange!");returnm_array[lndex]asIMap;}///<summary>///RemovetheinstanceofthegivenMap///</summary>///<paramname="Map"x/param>publicvoidRemove(IMapMap)(m_array.Remove(Map);}III<summary>IIICreateanewMap,addittothecollectionandreturnittothecaller///</summary>///<returnsx/returns>publicIMapCreate()(IMapnewMap=newMapClass();m_array.Add(newMap);returnnewMap;)///<summary>///AddthegivenMaptothecollection///</summary>///<paramname=,,Map"x/param>publicvoidAdd(IMapMap)(if(Map==null)thrownewException("Maps::Add:\r\nNewMapismotinitialized!");m_array.Add(Map);}#endregion)}3、新建打开文档类OpenNewMapDocument由于从工具栏自带的打开按钮打开地图文档的时候,不会自动进行两种视图之间的同步,所以我们要自己派生一个OpenNewMapDocument类,用于打开地图文档。右击项目名,选择“添加|类”,再选择ArcGIS类别中的BaseCommand模板,输入类名为“OpenNewMapDocument.cs"〇首先添加引用:usingSystem.Windows.Forms;usingESRLArcGIS.Carto;再添加如下成员变量:privateControlsSynchronizerm_controlsSynchronizer=null;修改默认的构造函数如下所示:〃添加参数publicOpenNewMapDocument(ControlsSynchronizerControlsSynchronizer){////TODO:Definevaluesforthepublicproperties//〃设定相关属性值base.m__category="Generic";//localizabletextbase.m_caption="Open";//localizabletextbase.m_message="ThisshouldworkinArcMap/MapControl/PageLayoutControl";//localizabletextbase.m_toolTip="Open";//localizabletextbase.m_name="GenerijOpen";//uniqueid,non-localizable(e.g."MyCategory_MyCommand")〃初始化m_controlsSynchronizerm_controlsSynchronizer=controlsSynchronizer;try(////TODO:changebitmapnameifnecessary//stringbitmapResourceName=GetType().Name+".bmp";base.m_bitmap=newBitmap(GetType(),bitmapResourceName);}catch(Exceptionex)(System.Diagnostics.Trace.WriteLine(ex.Message,"InvalidBitmap");}再在OnClick函数中添加如下代码:publicoverridevoidOnClick()(//TODO:AddOpenNewMapDocument.OnClickimplementationOpenFileDialogdig=newOpenFileDialogO;dlg.Filter="MapDocuments(*.mxd)|*.mxd";dlg.Multiselect=false;dlg.Title="OpenMapDocument";if(dlg.ShowDialog()==DialogResult.OK)(stringdocName=dlg.FileName;IMapDocumentmapDoc=newMapDocumentClass();if(mapDoc.getJsPresent(docName)&&!mapDoc.get_lsPasswordProtected(docName))mapDoc.Open(docName,string.Empty);IMapmap=mapDoc.get_Map(0);m__controlsSynchronizer.ReplaceMap(map);mapDoc.Close();}在添加类时,模板会自动添加―・个名为"OpenNewMapDocument.bmp”的图标,你可以自己修改或者替换为打开的文件夹的图标。4、两种视图的同步在3sdnMap.cs中添加成员变量,即同步类对象:privateControlsSynchronizerm_controlsSynchronizer=null;在Forml_Load函数中进行初始化工作:〃初始化controlssynchronizationcalssm_controlsSynchronizer=newControlsSynchronizer(m_mapControl,m_pageLayoutControl);〃把MapControl和PageLayoutContro!绑定起来(两个都指向同一个Map),然后设置MapControl为活动的Controlm_controlsSynchronizer.BindControls(true);〃为了在切换MapControl和PageLayoutControl视图同步,要添加FrameworkControlm_controlsSynchronizer.AddFrameworkControl(axToolbarControll.Object);m_controlsSynchronizer.AddFrameworkControl(this.axTOCControll.Object);//添加打开命令按钮到工具条OpenNewMapDocumentopenMapDoc=newOpenNewMapDocument(m_controlsSynchronizer);axToolbarControll.Addltem(openMapDoc,-1,0,false,-1,esriCommandStyles.esriCommandStylelconOnly);因为我们自动派生了打开文档类,并自己将其添加到工具条,所以我们就不需要工具条原来的“打开”按钮了,可以Toolbarcontrol的属性中将其删除。下面,我们可完成上一讲遗留的功能了。HI<summary>II!新建地图命令HI</summary>///<paramname="sender"x/param>///<paramname="e"x/param>privatevoidNew__Click(objectsender,EventArgse)(〃询问是否保存当前地图DialogResultres=MessageBox.Show("是否保存当前地图?ツ"提示",MessageBoxButtons.YesNo,MessageBoxIcon.Question);if(res==DialogResult.Yes)(〃如果要保存,调用另存为对话框ICommandcommand=newControlsSaveAsDocCommandClass();if(m_mapControl!=null)command.OnCreate(m_controlsSynchronizer.MapControl.Object);elsecommand.OnCreate(m_controlsSynchronizer.PageLayoutControl.Object);command.OnClick();}〃创建新的地图实例IMapmap=newMapClass();map.Name="Map";m_controlsSynchronizer.MapControl.DocumentFilename=string.Empty;〃量新新建地图实例的共享地图文档m_controlsSynchronizer.ReplaceMap(map);}HI<summary>//Z打开地图文档Mxd命令HI</summary>///<paramname="sender"x/param>///<paramname="e"x/param>privatevoidOpen_Click(objectsender,EventArgse)(if(this.axMapControll.LayerCount>0)(DialogResultresult=MessageBox.Show("是否保存当前地图?","警告",MessageBoxButtons.YesNoCancel,MessageBoxIcon.Question);if(result==DialogResult.Cancel)return;if(result==DialogResult.Yes)this.Save_Click(null,null);)OpenNewMapDocumentopenMapDoc=newOpenNewMapDocument(m_controlsSynchronizer);openMapDoc.OnCreate(m_controlsSynchronizer.MapControl.Object);openMapDoc.OnClick(

温馨提示

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

评论

0/150

提交评论