




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、ArcGISEngine+C#实例开发教程目 录第一讲 桌面GIS应用程序框架的建立2第二讲 菜单的添加及其实现5第三讲 MapControl与PageLayoutControl同步 9第四讲 状态栏信息的添加与实现24第五讲 鹰眼的实现27第六讲 右键菜单添加与实现32教程Bug及优化方案1 40第七讲 图层符号选择器的实现140第七讲 图层符号选择器的实现257第一讲 桌面GIS应用程序框架的建立本讲主要是使用MapControl、PageLayoutControl、ToolbarControl、TOCControl四个控件建立起基本的桌面GIS应用程序框架。最终成果预览如下:1、新建项目
2、启动VS2005,选择“文件|新建|项目”,在项目类型中选择VisualC#,再选择Windows应用程序模板,输入名称“3sdnMap”,点击确定。在解决方案管理器中将“Form1.cs”重命名为“3sdnMap.cs”,在设计视图中,选中窗体,将其属性中的“Text”改为“3sdnMap”。2、添加控件选择工具箱中的“菜单和工具栏|MenuStrip”,将其拖入窗体。选择工具箱中的“ArcGISWindowsForms”节,将“ToolbarControl”控件拖入窗体,并将其属性中的Dock设置为Top。选择工具箱中的“菜单和工具栏|StatusStrip”,将其拖入到窗体。选择工具箱中
3、的“容器|SplitContainer”容器拖入窗体,并将其属性中的Dock设置为Fill。将TabControl控件拖入Panel1,将Alignment属性设置为Bottom,Dock属性设置为Fill。点击TabPages属性右边的按钮,弹出TabPage集合编辑器,将tabPage1的Name设置为tabPageLayer,Text设置为图层,将tabPage2的Name设置为tabPageProperty,Text设置为属性。如下所示。选择“图层”选项卡,拖入TOCControl控件,设置Dock属性为Fill。选择“属性”选项卡,拖入DataGridView控件,设置Dock属性为
4、Fill。拖入TabControl控件到Panel2,设置Dock属性为Fill。并上述类似的方法,将两个选项卡的Name和Text分别设置为:(tabPageMap、地图),(tabPageLayout,制版)。选择“地图”选项卡,拖入MapControl控件,设置Dock属性为Fill。选择“制版”选项卡,拖入PageLayoutControl控件,设置Dock属性为Fill。最后将LicenseControl控件拖入到窗体的任意地方。按F5编译运行,可以看到刚才布局好的程序界面了。3、控件绑定通过以上步骤添加的控件还只是单独存在,而我们的程序需要各控件间协同工作,因此要进行控件绑定。分别
5、右击ToolbarControl、TOCControl控件,将Buddy设置为axMapControl1,如下图所示。这样,工具条和图层控件就与地图控件关联了。4、添加工具此时,工具条中还没有任何工具,添加的方法也很简单。右击ToolbarControl,选择“属性|Items”,点击Add,选择Commands选项卡中的Generic,双击Open、SaveAs、Redo、Undo即可将相应工具添加到工具条常见的工具有:MapNavigation中的导航工具,MapInquiry中的查询工具,FeatureSelection中的选择工具,你可以根据需要酌情添加工具。5、编译运行按F5即可编译
6、运行程序,至此桌面GIS应用程序框架基本框架已经搭建好了,你可以通过工具条的工具打开地图文档,浏览地图了,效果如开篇所示.第二讲 菜单的添加及其实现在上一讲中,我们实现了应用程序基本框架,其中有个小错误,在此先跟大家说明下。在“属性”选项卡中,我们当时添加的是DataGridView控件,这个控件是用来显示数据表的,而专门用于属性的查询和设置的控件是PropertyGrid控件。因此请你删除“属性”选项卡中的DataGridView控件,再把位于“工具箱|所有Windows窗体|PropertyGrid”(如果没有,右击选择“选择项”以添加此控件)控件拖到该选项卡。在这一讲中,主要讲解菜单的添
7、加和实现。1、添加菜单在设计视图中,单击菜单栏,会出现“请在此处键入”的提示,单击提示就可以键入菜单名称,如“文件”,再单击“文件”,即可输入其下拉子菜单,如下所示:Tips:每创建一个菜单,请在其属性面板中设置Name属性,而且不要为中文,因此Name值将是此菜单响应函数的函数名的一部分,带中文的函数名,总是不好吧。本讲中,我们将添加新建(New)、打开(Open)、添加数据(AddData)、保存(Save)、另存为(SaveAs)、退出(Exit)这些菜单,()内为相应的Name属性值。Tips:你可以在属性面板中的Text属性中,把菜单名设置为中英文形式,如“打开Open”,带下划线的
8、O表示此项菜单的快捷键是字母O,设置方法是在相应字母前加上“&”字符,如“打开&Open”。但这种快捷键只在打开此下拉菜单时才有效,即当你单击“文件”菜单弹出下拉菜单时,按下字母O就可以定位到“打开”菜单。还有一种在程序运行时都有效的全局快捷键,可以在属性面板中的“ShortCutKeys”中设置。你还可以在属性面板中的Image属性中设置你喜欢的菜单图标。单击Image那一行右边的按钮,弹出如下菜单。选择“项目资源文件”,再单击导入就可以选择你的图标了最终效果如下所示。注意,在解决方案面板中,选中刚才添加的所有图标,在其属性面板中将生成操作设置为“嵌入的资源”,这一点很重要!2、实现相关菜单
9、首先定义指针(写在public partial classForm1:Form下面即可):Private3 m_mapControl=null;private 2 m_pageLayoutControl=null;private IMapDocumentpMapDocument;若以上指针无效,请添加以下引用:usingESRI.ArcGIS.Carto;usingESRI.ArcGIS.Controls;usingESRI.ArcGIS.esriSystem;usingESRI.ArcGIS.Display;usingESRI.ArcGIS.Geometry;usingESRI.ArcGIS
10、.SystemUI;在设计视图中的属性面板中,选择Form1,即主窗体,单击事件按钮(闪电形状的那个按钮),打到“Load”事件并双击,添加此事件。在Form1_Load函数中初始化这些指针:/取得MapControl和PageLayoutControl的引用m_mapControl=(IMapControl3)this.axMapControl1.Object;m_pageLayoutControl=(IPageLayoutControl2)this.axPageLayoutControl1.Object;依次双击每个菜单项,添加菜单响应函数。实现代码如下:/新建地图命令/privatevo
11、idNew_Click(objectsender,EventArgse)/本命令涉及到MapControl和PageLayoutControl同步问题,将在下一讲中实现/打开地图文档Mxd命令/Private void Open_Click(objectsender,EventArgse)/本命令涉及到MapControl和PageLayoutControl同步问题,将在下一讲中实现/添加数据命令/Private void AddData_Click(objectsender,EventArgse)Int currentLayerCount=this.axMapControl1.LayerCo
12、unt;ICommand pCommand=new ControlsAddDataCommandClass();pCommand.OnCreate(this.axMapControl1.Object);pCommand.OnClick();/保存地图文档命令/Private void Save_Click(objectsender,EventArgse)/首先确认当前地图文档是否有效if(null!=m_pageLayoutControl.DocumentFilename&m_mapControl.CheckMxFile(m_pageLayoutControl.DocumentFilename
13、)/创建一个新的地图文档实例IMapDocumentmapDoc=newMapDocumentClass();/打开当前地图文档mapDoc.Open(m_pageLayoutControl.DocumentFilename,string.Empty);/用PageLayout中的文档替换当前文档中的PageLayout部分mapDoc.ReplaceContents(IMxdContents)m_pageLayoutControl.PageLayout);/保存地图文档mapDoc.Save(mapDoc.UsesRelativePaths,false);mapDoc.Close();/另存
14、为地图文档命令/Private void SaveAs_Click(objectsender,EventArgse)/调用另存为命令ICommand command=newControlsSaveAsDocCommandClass();l);command.OnClick();/退出程序/Private void Exit_Click(objectsender,EventArgse)Application.Exit();3、编译运行按F5编译运行程序。也许你会发现,菜单命令的实现方式都是类型的。没错,在中,内置了许多常用的Command和Tool,如ControlsAddDataCommand
15、Class、ControlsMapZoomInToolClass、ControlsMapPanToolClass等等,这些内置对象在命名空间中,你可以对象浏览器中查看。而且这些内置对象的调用方式都类似,如下所示:/定义ICommandcommand=new ControlsSaveAsDocCommandClass();/创建command.OnCreate(m_controlsSynchronizer.ActiveControl);/调用command.OnClick();希望你可以举一反三,去实现更多的你想要的功能。第三讲 MapControl与PageLayoutControl同步在Ar
16、cMap中,能够很方面地进行MapView和LayoutView两种视图的切换,而且二者之间的数据是同步显示的。关于两种视图同步的实现方法有多种,可以使用ObjectCopy对象进行数据硬拷贝,而比较简单的方法莫过于二者共享一份地图了,这也是最常用的方法。1、新建同步类ControlsSynchronizer在解决方案面板中右击项目名,选择“添加|类”,在类别中选择“VisualC#项目项”,在模板中选择“类”,输入类名“ControlsSynchronizer.cs”,将以下代码覆盖自动生成的代码:usingSystem;usingSystem.Drawing;usingSystem.Col
17、lections;usingSystem.ComponentModel;usingSystem.Windows.Forms;usingSystem.IO;untime.InteropServices;usingESRI.ArcGIS.esriSystem;usingESRI.ArcGIS.Carto;usingESRI.ArcGIS.Controls;usingESRI.ArcGIS.SystemUI;namespace_sdnMap/ThisclassisusedtosynchronizeagvenPageLayoutControlandaMapControl./Wheninitialize
18、d,theusermustpassthereferenceofthesecontroltotheclass,bind/thecontroltogetherbycallingBindControlswhichinturnsetsajoinedMapreferenced/bybothcontrol;andsetallthebuddycontrolsjoinedbetweenthesetwocontrols./WhenalternatingbetweentheMapControlandPageLayoutControl,youshouldactivatethevisiblecontrol/andde
19、activatetheotherbycallingActivateXXX./Thiscalssislimitedtoasituationwherethecontrolsarenotsimultaneouslyvisible./publicclassControlsSynchronizer#regionclassmembersprivateIMapControl3m_mapControl=null;privateIPageLayoutControl2m_pageLayoutControl=null;privateIToolm_mapActiveTool=null;privateIToolm_pa
20、geLayoutActiveTool=null;privateboolm_IsMapCtrlactive=true;privateArrayListm_frameworkControls=null;#endregion#regionconstructor/默认构造函数/publicControlsSynchronizer()/初始化ArrayListm_frameworkControls=newArrayList();/构造函数/publicControlsSynchronizer(IMapControl3mapControl,IPageLayoutControl2pageLayoutCont
21、rol):this()/为类成员赋值m_mapControl=mapControl;m_pageLayoutControl=pageLayoutControl;#endregion#regionproperties/取得或设置MapControl/publicIMapControl3MapControlgetreturnm_mapControl;setm_mapControl=value;/取得或设置PageLayoutControl/publicIPageLayoutControl2PageLayoutControlgetreturnm_pageLayoutControl;setm_page
22、LayoutControl=value;/取得当前ActiveView的类型/publicstringActiveViewTypegetif(m_IsMapCtrlactive)returnMapControl;elsereturnPageLayoutControl;/取得当前活动的Control/publicobjectActiveControlgetif(m_mapControl=null|m_pageLayoutControl=null)thrownewException(ControlsSynchronizer:ActiveControl:rnEitherMapControlorPag
23、eLayoutControlarenotinitialized!);if(m_IsMapCtrlactive)returnm_mapControl.Object;elsereturnm_pageLayoutControl.Object;#endregion#regionMethods/激活MapControl并解除thePagleLayoutControl/publicvoidActivateMap()tryif(m_pageLayoutControl=null|m_mapControl=null)thrownewException(ControlsSynchronizer:ActivateM
24、ap:rnEitherMapControlorPageLayoutControlarenotinitialized!);/缓存当前PageLayout的CurrentToolif(m_pageLayoutControl.CurrentTool!=null)m_pageLayoutActiveTool=m_pageLayoutControl.CurrentTool;/解除PagleLayoutm_pageLayoutControl.ActiveView.Deactivate();/激活MapControlm_mapControl.ActiveView.Activate(m_mapControl.
25、hWnd);/将之前MapControl最后使用的tool,作为活动的tool,赋给MapControl的CurrentToolif(m_mapActiveTool!=null)m_mapControl.CurrentTool=m_mapActiveTool;m_IsMapCtrlactive=true;/为每一个的frameworkcontrols,设置Buddycontrol为MapControlthis.SetBuddies(m_mapControl.Object);catch(Exceptionex)thrownewException(string.Format(ControlsSyn
26、chronizer:ActivateMap:rn0,ex.Message);/激活PagleLayoutControl并减活MapCotrol/publicvoidActivatePageLayout()tryif(m_pageLayoutControl=null|m_mapControl=null)thrownewException(ControlsSynchronizer:ActivatePageLayout:rnEitherMapControlorPageLayoutControlarenotinitialized!);/缓存当前MapControl的CurrentToolif(m_ma
27、pControl.CurrentTool!=null)m_mapActiveTool=m_mapControl.CurrentTool;/解除MapControlm_mapControl.ActiveView.Deactivate();/激活PageLayoutControlm_pageLayoutControl.ActiveView.Activate(m_pageLayoutControl.hWnd);/将之前PageLayoutControl最后使用的tool,作为活动的tool,赋给PageLayoutControl的CurrentToolif(m_pageLayoutActiveToo
28、l!=null)m_pageLayoutControl.CurrentTool=m_pageLayoutActiveTool;m_IsMapCtrlactive=false;/为每一个的frameworkcontrols,设置Buddycontrol为PageLayoutControlthis.SetBuddies(m_pageLayoutControl.Object);catch(Exceptionex)thrownewException(string.Format(ControlsSynchronizer:ActivatePageLayout:rn0,ex.Message);/给予一个地图
29、,置换PageLayoutControl和MapControl的focusmap/publicvoidReplaceMap(IMapnewMap)if(newMap=null)thrownewException(ControlsSynchronizer:ReplaceMap:rnNewmapforreplacementisnotinitialized!);if(m_pageLayoutControl=null|m_mapControl=null)thrownewException(ControlsSynchronizer:ReplaceMap:rnEitherMapControlorPageL
30、ayoutControlarenotinitialized!);/createanewinstanceofIMapscollectionwhichisneededbythePageLayout/创建一个PageLayout需要用到的,新的IMapscollection的实例IMapsmaps=newMaps();/addthenewmaptotheMapscollection/把新的地图加到Mapscollection里头去maps.Add(newMap);boolbIsMapActive=m_IsMapCtrlactive;/callreplacemaponthePageLayoutinor
31、dertoreplacethefocusmap/wemustcallActivatePageLayout,sinceitisthecontrolwecallReplaceMaps/调用PageLayout的replacemap来置换focusmap/我们必须调用ActivatePageLayout,因为它是那个我们可以调用ReplaceMaps的Controlthis.ActivatePageLayout();m_pageLayoutControl.PageLayout.ReplaceMaps(maps);/assignthenewmaptotheMapControl/把新的地图赋给MapCo
32、ntrolap=newMap;/resettheactivetools/重设activetoolsm_pageLayoutActiveTool=null;m_mapActiveTool=null;/makesurethatthelastactivecontrolisactivated/确认之前活动的control被激活if(bIsMapActive)this.ActivateMap();m_mapControl.ActiveView.Refresh();elsetivatePageLayout();m_pageLayoutControl.ActiveView.Refresh();/bindth
33、eMapControlandPageLayoutControltogetherbyassigninganewjointfocusmap/指定共同的Map来把MapControl和PageLayoutControl绑在一起/trueiftheMapControlsupposedtobeactivatedfirst,如果MapControl被首先激活,则为truepublicvoidBindControls(IMapControl3mapControl,IPageLayoutControl2pageLayoutControl,boolactivateMapFirst)if(mapControl=n
34、ull|pageLayoutControl=null)thrownewException(ControlsSynchronizer:BindControls:rnEitherMapControlorPageLayoutControlarenotinitialized!);m_mapControl=MapControl;m_pageLayoutControl=pageLayoutControl;this.BindControls(activateMapFirst);/bindtheMapControlandPageLayoutControltogetherbyassigninganewjoint
35、focusmap/指定共同的Map来把MapControl和PageLayoutControl绑在一起/trueiftheMapControlsupposedtobeactivatedfirst,如果MapControl被首先激活,则为truepublicvoidBindControls(boolactivateMapFirst)if(m_pageLayoutControl=null|m_mapControl=null)thrownewException(ControlsSynchronizer:BindControls:rnEitherMapControlorPageLayoutContro
36、larenotinitialized!);/createanewinstanceofIMap/创造IMap的一个实例IMapnewMap=newMapClass();newMap.Name=Map;/createanewinstanceofIMapscollectionwhichisneededbythePageLayout/创造一个新的IMapscollection的实例,这是PageLayout所需要的IMapsmaps=newMaps();/addthenewMapinstancetotheMapscollection/把新的Map实例赋给Mapscollectionmaps.Add(n
37、ewMap);/callreplacemaponthePageLayoutinordertoreplacethefocusmap/调用PageLayout的replacemap来置换focusmapm_pageLayoutControl.PageLayout.ReplaceMaps(maps);/assignthenewmaptotheMapControl/把新的map赋给MapControlm_mapControl.Map=newMap;/resettheactivetools/重设activetoolsm_pageLayoutActiveTool=null;m_mapActiveTool=
38、null;/makesurethatthelastactivecontrolisactivated/确定最后活动的control被激活if(activateMapFirst)this.ActivateMap();elsethis.ActivatePageLayout();/bypassingtheapplicationstoolbarsandTOCtothesynchronizationclass,itsavesyouthe/managementofthebuddycontroleachtimetheact/controltoanarray;oncetheactivecontrolchange
39、s,theclassiteratesthroughthearrayand/callesSetBuddyControloneachofthestoredframeworkcontrol./publicvoidAddFrameworkControl(objectcontrol)if(control=null)thrownewException(ControlsSynchronizer:AddFrameworkControl:rnAddedcontrolisnotinitialized!);m_frameworkControls.Add(control);/Removeaframeworkcontr
40、olfromthemanagedlistofcontrols/publicvoidRemoveFrameworkControl(objectcontrol)if(control=null)thrownewException(ControlsSynchronizer:RemoveFrameworkControl:rnControltoberemovedisnotinitialized!);m_frameworkControls.Remove(control);/Removeaframeworkcontrolfromthemanagedlistofcontrolsbyspecifyingitsin
41、dexinthelist/publicvoidRemoveFrameworkControlAt(intindex)if(m_frameworkControls.Countindex)thrownewException(ControlsSynchronizer:RemoveFrameworkControlAt:rnIndexisoutofrange!);m_frameworkControls.RemoveAt(index);/whentheactivecontrolchanges,theclassiteratesthroughthearrayoftheframeworkcontrols/andc
42、allesSetBuddyControloneachofthecontrols./theactivecontrolprivatevoidSetBuddies(objectbuddy)tryif(buddy=null)thrownewException(ControlsSynchronizer:SetBuddies:rnTargetBuddyControlisnotinitialized!);foreach(objectobjinm_frameworkControls)if(objisIToolbarControl)(IToolbarControl)obj).SetBuddyControl(bu
43、ddy);elseif(objisITOCControl)(ITOCControl)obj).SetBuddyControl(buddy);catch(Exceptionex)thrownewException(string.Format(ControlsSynchronizer:SetBuddies:rn0,ex.Message);#endregion2、新建Maps类在同步类中,要用到Maps类,用于管理地图对象。与新建同步类ControlsSynchronizer类似,我们新建一Maps类,其所有代码如下所示:usingSystem;usingSystem.Collections;usi
44、ngSystem.Collections.Generic;usingSystem.Text;usingSystem.Runtime.InteropServices;usingESRI.ArcGIS.Carto;namespace_sdnMapGuid(f27d8789-fbbc-4801-be78-0e3cd8fff9d5)ClassInterface(ClassInterfaceType.None)ProgId(_sdnMap.Maps)publicclassMaps:IMaps,IDisposable/classmember-usinginternallyanArrayListtomana
45、getheMapscollectionprivateArrayListm_array=null;#regionclassconstructorpublicMaps()m_array=newArrayList();#endregion#regionIDisposableMembers/Disposethecollection/publicvoidDispose()if(m_array!=null)m_array.Clear();m_array=null;#endregion#regionIMapsMembers/RemovetheMapatthegivenindex/publicvoidRemo
46、veAt(intIndex)if(Indexm_array.Count|Index0)thrownewException(Maps:RemoveAt:rnIndexisoutofrange!);m_array.RemoveAt(Index);/ResettheMapsarray/publicvoidReset()m_array.Clear();/GetthenumberofMapsinthecollection/publicintCountgetreturnm_array.Count;/ReturntheMapatthegivenindex/publicIMapget_Item(intInde
47、x)if(Indexm_array.Count|Index0)thrownewException(Maps:get_Item:rnIndexisoutofrange!);returnm_arrayIndexasIMap;/RemovetheinstanceofthegivenMap/publicvoidRemove(IMapMap)m_array.Remove(Map);/CreateanewMap,addittothecollectionandreturnittothecaller/publicIMapCreate()IMapnewMap=newMapClass();m_array.Add(
48、newMap);returnnewMap;/AddthegivenMaptothecollection/publicvoidAdd(IMapMap)if(Map=null)thrownewException(Maps:Add:rnNewMapismotinitialized!);m_array.Add(Map);#endregion3、新建打开文档类OpenNewMapDocument由于从工具栏自带的打开按钮打开地图文档的时候,不会自动进行两种视图之间的同步,所以我们要自己派生一个OpenNewMapDocument类,用于打开地图文档。右击项目名,选择“添加|类”,再选择ArcGIS类别中
49、的BaseCommand模板,输入类名为“OpenNewMapDocument.cs”。首先添加引用:usingSystem.Windows.Forms;usingESRI.ArcGIS.Carto;再添加如下成员变量:privateControlsSynchronizerm_controlsSynchronizer=null;修改默认的构造函数如下所示:/添加参数publicOpenNewMapDocument(ControlsSynchronizercontrolsSynchronizer)/TODO:Definevaluesforthepublicproperties/设定相关属性值ba
50、se.m_category=Generic;/localizabletextbase.m_caption=Open;/localizabletextbase.m_message=ThisshouldworkinArcMap/MapControl/PageLayoutControl;/localizabletextbase.m_toolTip=Open;/localizabletextbase.m_name=Generic_Open;/uniqueid,non-localizable(e.g.MyCategory_MyCommand)/初始化m_controlsSynchronizerm_con
51、trolsSynchronizer=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()
52、OpenFileDialogdlg=newOpenFileDialog();dlg.Filter=MapDocuments(*.mxd)|*.mxd;dlg.Multiselect=false;dlg.Title=OpenMapDocument;if(dlg.ShowDialog()=DialogResult.OK)stringdocName=dlg.FileName;IMapDocumentmapDoc=newMapDocumentClass();if(mapDoc.get_IsPresent(docName)&!mapDoc.get_IsPasswordProtected(docName)
53、mapDoc.Open(docName,string.Empty);IMapmap=mapDoc.get_Map(0);m_controlsSynchronizer.ReplaceMap(map);mapDoc.Close();在添加类时,模板会自动添加一个名为“OpenNewMapDocument.bmp”的图标,你可以自己修改或者替换为打开的文件夹的图标4、两种视图的同步在中添加成员变量,即同步类对象:privateControlsSynchronizerm_controlsSynchronizer=null;在Form1_Load函数中进行初始化工作:/初始化controlssynchr
54、onizationcalssm_controlsSynchronizer=newControlsSynchronizer(m_mapControl,m_pageLayoutControl);/把MapControl和PageLayoutControl绑定起来(两个都指向同一个Map),然后设置MapControl为活动的Controlm_controlsSynchronizer.BindControls(true);/为了在切换MapControl和PageLayoutControl视图同步,要添加FrameworkControlorkControl(axToolbarControl1.Obj
55、ect);m_controlsSynchronizer.AddFrameworkControl(this.axTOCControl1.Object);/添加打开命令按钮到工具条OpenNewMapDocumentopenMapDoc=newOpenNewMapDocument(m_controlsSynchronizer);axToolbarControl1.AddItem(openMapDoc,-1,0,false,-1,esriCommandStyles.esriCommandStyleIconOnly);因为我们自动派生了打开文档类,并自己将其添加到工具条,所以我们就不需要工具条原来的“
56、打开”按钮了,可以ToolbarControl的属性中将其删除。下面,我们可完成上一讲遗留的功能了。/新建地图命令/privatevoidNew_Click(objectsender,EventArgse)/询问是否保存当前地图DialogResultres=MessageBox.Show(是否保存当前地图?,提示,MessageBoxButtons.YesNo,MessageBoxIcon.Question);if(res=DialogResult.Yes)/如果要保存,调用另存为对话框ICommandcommand=newControlsSaveAsDocCommandClass();if
57、(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_control
58、sSynchronizer.ReplaceMap(map);/打开地图文档Mxd命令/privatevoidOpen_Click(objectsender,EventArgse)if(this.axMapControl1.LayerCount0)DialogResultresult=MessageBox.Show(是否保存当前地图?,警告,MessageBoxButtons.YesNoCancel,MessageBoxIcon.Question);if(result=DialogResult.Cancel)return;if(result=DialogResult.Yes)this.Save_
59、Click(null,null);OpenNewMapDocumentopenMapDoc=newOpenNewMapDocument(m_controlsSynchronizer);openMapDoc.OnCreate(m_controlsSynchronizer.MapControl.Object);openMapDoc.OnClick();在添加数据AddData时,我们也要进行地图共享,故在AddData_Click函数后面添加如下代码:IMappMap=this.axMapControl1.Map;this.m_controlsSynchronizer.ReplaceMap(pMa
60、p);在另存为地图文档时,有可能会丢失数据,因此我们需要提示用户以确认操作,故需修改SaveAs_Click函数,如下所示:/另存为地图文档命令/privatevoidSaveAs_Click(objectsender,EventArgse)/如果当前视图为MapControl时,提示用户另存为操作将丢失PageLayoutControl中的设置if(m_controlsSynchronizer.ActiveControlisIMapControl3)if(MessageBox.Show(另存为地图文档将丢失制版视图的设置rn您要继续吗?,提示,MessageBoxButtons.YesNo,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- A-Level物理(AS)2024-2025年模拟试卷:力学与材料科学知识体系构建
- 护理操作小组规范化建设汇报
- 精通MySQL数据库的实战试题及答案
- 甘肃省平凉市静宁县一中2020-2021学年高一上学期第二次月考试题实验班(解析版物理)
- 风险管理的重要意义
- 【《伊莱克斯电器股权激励方案的实施过程与效果分析》12000字】
- 2025年虚拟现实工程师认证模拟试卷:VR场景开发中的技术挑战
- 2025年消防安全知识培训考试题库:消防信息化系统应用综合知识试题
- 2025年注册测绘师大地测量考试模拟试题集(含答案与评分)大地测量专题
- 成本管理会计案例分析
- GB/T 6974.3-2024起重机术语第3部分:塔式起重机
- 福建师范大学《生活中的科学》2023-2024学年第一学期期末试卷
- 通达信公式编写教程
- 当代国际政治与经济 期末复习课件高中政治统编版选择性必修一
- 2025届南宁二中、柳州高中高考物理二模试卷含解析
- 消防应急预案电子版
- 2.6.2数列求和公开课一等奖课件省赛课获奖课件
- 河南工业大学课件模板
- 【甲子光年】2024自动驾驶行业报告-“端到端”渐行渐近
- 公司道德和商业行为准则
- 江苏省常州市重点中学2025届高考历史三模试卷含解析
评论
0/150
提交评论