carcengine第一讲桌面GIS应用程序框架的建立_第1页
carcengine第一讲桌面GIS应用程序框架的建立_第2页
carcengine第一讲桌面GIS应用程序框架的建立_第3页
carcengine第一讲桌面GIS应用程序框架的建立_第4页
carcengine第一讲桌面GIS应用程序框架的建立_第5页
已阅读5页,还剩60页未读 继续免费阅读

下载本文档

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

文档简介

GIS应用程序框架。最终成果预览如下:1VS2005,选择“文件|新建|VisualC#Windows应用程序模3sdnMap3sdnap.cs3sdnMap2 Strip,DockTop。|StatusStrip,选择工具箱中的“容器|SplitContainer”容器拖入窗体,并将其属性中的DockFillPanel1BottomDocktabPage2的NametabPageProperty,Text设置为属性。如下所示。TOCControl控件,设置DockFill。选择“属性”选项卡,拖入DataGridViewDockFill。(tabPageMa(tabPageLayoutMapControlDockFill。PageLayoutControlDockFill。LicenseControl控件拖入到窗体的任意地方。3ToolbarControl、TOCControlBuddy设置为axMapControl14|ItemsAddCommands选项卡中的GenericOpen、SaveAs、Redo、Undo即可将相应工具MapNavigation中的导航工具,MapInquiry中的查询工具,FeatureSelection中的选择工具,你可以5单的添加及其实|Windows|PropertyGrid(如果没有,右击选择“选择项”以添加此控1TipsNameName值将是此菜单本讲中,添加新建(New、打开(Open、添加数据(AddData、保存(Save、另存为(SaveAs、退出(Exit)()内为相应的Name属性值。TextOpenO表示此项菜单的快捷键是字母O&&OpenShortCutKeysImageImage2首先定义指针(publicpartialclassForm1Form下面即可privateESRI.ArcGIS.Controls.IMapControl3m_mapControl=privateESRI.ArcGIS.Controls.IPageLayoutControl2m_pageLayoutControl=null;privateIMap 若以上指针无效,请添加以下usingESRI.ArcGIS.Carto;usingESRI.ArcGIS.Controls;usingESRI.ArcGIS.esriSystem;usingESRI.ArcGIS.Display;usingESRI.ArcGIS.Geometry;usingESRI.ArcGIS.SystemUI;到“Load”事件并双击,添加此事件。Form1_Load//MapControlPageLayoutControl的m_mapControl=(IMapControl3)this.axMapControl1.Object;m_pageLayoutControl(IPageLayoutControl2)this.axPageLayoutControl1.Object;////////////<param///<paramprivatevoidNew_Click(objectsender,EventArgs{//MapControlPageLayoutControl}//////Mxd//////<param///<paramprivatevoidOpen_Click(objectsender,EventArgs{//MapControlPageLayoutControl}////////////<param///<paramprivatevoidAddData_Click(objectsender,EventArgs{intcurrentLayerCount=this.axMapControl1.LayerCount;ICommandpCommand=new }////////////<param///<paramprivatevoidSave_Click(objectsender,EventArgs{// {//IMapmapDoc=newMap////PageLayoutPageLayout//保存地图文档mapDoc.Save(mapDoc.UsesRelativePaths,false);}}////////////<param///<paramprivatevoidSaveAs_Click(objectsender,EventArgs{//ICommandcommand=newCo }////////////<param///<paramprivatevoidExit_Click(objectsender,EventArgs{}3按F5编译运行程序。也许你会发现,菜单命令的实现方式都是类型的。没错,在AE9.2中,内置了许多常用的 ,如 等等,这些内置对象在ESRI.ArcGIS.Controls命名空间中你可以对象浏览器中查看而且这些内置对象的调用方式都类似,//ICommandcommand=new ////MapControlPageLayoutControl同ArcMapMapViewLayoutView两种视图的切换,而且二者之间的数据ObjectCopy对象进行数据硬拷贝,而比较简单的方在解决方案面板中右击项目名,选择“添加|VisualC#ConrolsSyncronize.csusingusingSystem.Drawing;usingSystem.Collections; usingSystem.Windows.Forms;usingSystem.IO;usingSystem.Runtime.InteropServices;usingESRI.ArcGIS.esriSystem;usingESRI.ArcGIS.Carto;usingESRI.ArcGIS.Controls;usingESRI.ArcGIS.SystemUI;namespace_sdnMap{//////ThisclassisusedtosynchronizeagvenPageLayoutControlanda///Wheninitialized,theusermustpassthereferenceofthesecontroltotheclass,///thecontroltogetherbycalling'BindControls'whichinturnsetsajoinedMap///bybothcontrol;andsetallthebuddycontrolsjoinedbetweenthesetwo///WhenalternatingbetweentheMapControlandPageLayoutControl,youshouldactivatethevisible///anddeactivatetheotherbycalling///Thiscalssislimitedtoasituationwherethecontrolsarenotsimultaneously///publicclass{#regionclassprivateIMapControl3m_mapControl=privateIPageLayoutControl2m_pageLayoutControl=null;privateIToolm_mapActiveTool=null;privateIToolm_pageLayoutActiveTool=null;privateboolm_IsMapCtrlactive=true;privateArrayListm_frameworkControls=null;#region/////////public{//ArrayListm_frameworkControlsnewArrayList();}////////////<param///<param :{m_mapControlmapControl;m_pageLayoutControl=}#regionproperties/////////publicIMapControl3{get{returnm_mapControl;}set{m_mapControl=value;}}/////////publicIPageLayoutControl2{get{returnm_pageLayoutControl;}set{m_pageLayoutControl=value;}}//////ActiveView///publicstring{{

if(m_IsMapCtrlactive)return"MapControl";}}

return/////////publicobject{{

if(m_mapControl==null||m_pageLayoutControl== MapControlorPageLayoutControlarenotifreturn}}

return#regionMethods//////MapControlthe///publicvoid{{if(m_pageLayoutControl==null||m_mapControl==thrownewException("ControlsSynchronizer::ActivateMap:\r\nEitherorPageLayoutControlarenot //MapControl//将之前MapControl最后使用的tool,作为活动的tool,赋给MapControl}

if(m_mapActiveTool!=null)m_mapControl.CurrentTool=m_mapActiveTool;m_IsMapCtrlactive=true;//frameworkcontrols,Buddycontrolcatch(Exception{ }}//////PagleLayoutControl///publicvoid{{if(m_pageLayoutControl==null||m_mapControl== MapControlorPageLayoutControlarenot//MapControl//PageLayoutControl将之前PageLayoutControl最后使用的tool,作为活动的toolPageLayoutControl m_IsMapCtrlactive=//frameworkcontrols,BuddycontrolPageLayoutControl}catch(Exception{ }}//////给予一个地图,PageLayoutControlMapControlfocus//////<paramname="newMap"></param>publicvoidReplaceMap(IMapnewMap){if(newMap== replacementisnotinitialized!");if(m_pageLayoutControl==null||m_mapControl==thrownewException("ControlsSynchronizer::ReplaceMap:\r\nEitherMapControlorPageLayoutControlarenotinitialized!");//createanewinstanceofIMapscollectionwhichisneededbythe//PageLayout需要用到的,新的IMapscollectionIMapsmaps=new//addthenewmaptotheMapsboolbIsMapActive=//callreplacemaponthePageLayoutinordertoreplacethefocus//wemustcallActivatePageLayout,sinceitisthecontrolwecall//PageLayout的replacemapfocus//须调用ActivatePageLayout,因为它是那个我们可以调用"ReplaceMaps"

//assignthenewmaptothe//MapControlm_mapControl.MapnewMap;//resettheactive//activetoolsm_pageLayoutActiveToolnull;m_mapActiveTool=null;//makesurethatthelastactivecontrolis//controlif{}{}}

//////bindtheMapControlandPageLayoutControltogetherbyassigninganewjointfocus///MapMapControlPageLayoutControl//////<param///<param///<paramname="activateMapFirst">trueiftheMapControlsupposedtobeactivatedfirst,如果MapControl被首先激活,true</param>publicvoidBindControls(IMapControl3mapControl,IPageLayoutControl2pageLayoutControl,boolactivateMapFirst){if(mapControl==null||pageLayoutControl==thrownewException("ControlsSynchronizer::BindControls:\r\nEitherMapControlorPageLayoutControlarenotinitialized!");m_mapControl=MapControl;m_pageLayoutControl=pageLayoutControl;}//////bindtheMapControlandPageLayoutControltogetherbyassigninganewjointfocus///MapMapControlPageLayoutControl//////<paramname="activateMapFirst">trueiftheMapControlsupposedtobeactivatedfirst,如果MapControl被首先激活,true</param>publicvoidBindControls(bool{if(m_pageLayoutControl==null||m_mapControl==thrownewException("ControlsSynchronizer::BindControls:\r\nEitherMapControlorPageLayoutControlarenotinitialized!");//createanewinstanceof//IMapIMapnewMap=newMapClass();newMap.Name="Map";//createanewinstanceofIMapscollectionwhichisneededbytheIMapsmaps=new//addthenewMapinstancetotheMaps//MapMapscollection//callreplacemaponthePageLayoutinordertoreplacethefocus//PageLayout的replacemapfocusmap//assignthenewmaptothe//mapMapControlm_mapControl.Map//resettheactive//activetoolsm_pageLayoutActiveToolnull;m_mapActiveTool=null;//makesurethatthelastactivecontrolis//controlif(activateMapFirst)}

//////bypassingtheapplication'stoolbarsandTOCtothesynchronizationclass,itsavesyou///managementofthebuddycontroleachtimetheactivecontrolchanges.Thismethodadsthe///controltoanarray;oncetheactivecontrolchanges,theclassiteratesthroughthearray///callesSetBuddyControloneachofthestoredframework//////<param{if(control==isnot}//////Removeaframeworkcontrolfromthemanagedlistof//////<parampublicvoidRemoveFrameworkControl(object{if(control==beremovedisnot}//////Removeaframeworkcontrolfromthemanagedlistofcontrolsbyspecifyingitsindexinthe//////<parampublicvoidRemoveFrameworkControlAt(int{if(m_frameworkControls.Count<outof}//////whentheactivecontrolchanges,theclassiteratesthroughthearrayoftheframework andcallesSetBuddyControloneachofthe//////<paramname="buddy">theactivecontrol</param>privatevoidSetBuddies(objectbuddy){{isnot

if(buddy==foreach(objectobjin{if(objis{}elseif(objis{}}}catch(Exception{ }}}}2MapsMapsControlsSynchronizer类似,我们Maps类,其所有代码如下所示:usingusingusingSystem.Collections.Generic;usingSystem.Text;usingSystem.Runtime.InteropServices;usingESRI.ArcGIS.Carto;namespace{publicclassMaps:IMaps,{//classmember-usinginternallyanArrayListtomanagetheMapscollectionprivateArrayListm_array=null;#regionclassconstructorpublicMaps(){m_array=new}#regionIDisposable//////Disposethe///</summary>publicvoidDispose(){if(m_array!={m_array=null;}}#regionIMaps//////RemovetheMapatthegiven//////<paramname="Index"></param>publicvoidRemoveAt(intIndex){if(Index>m_array.Count||Index<thrownewException("Maps::RemoveAt:\r\nIndexisoutofrange!");}//////ResettheMaps///</summary>publicvoidReset(){}//////GetthenumberofMapsinthe///</summary>publicint{{}}

return//////ReturntheMapatthegiven//////<param///publicIMapget_Item(int{if(Index>m_array.Count||Index<thrownewException("Maps::get_Item:\r\nIndexisoutofrange!");returnm_array[Index]asIMap;}//////Removetheinstanceofthegiven//////<paramname="Map"></param>publicvoidRemove(IMapMap){}//////CreateanewMap,addittothecollectionandreturnittothe//////<returns></returns>publicIMapCreate(){IMapnewMap=newreturnnewMap;}//////AddthegivenMaptothe//////<paramname="Map"></param>publicvoidAdd(IMapMap){if(Map==thrownewException("Maps::Add:\r\nNewMapismotinitialized!");}}}3、新建打开文档类由于从自带的打开按钮打开地图文档的时候,不会自动进行两种视图之间的同步,所以我们要自己派生一个OpenNewMap 右击项目名,选择“添加|类”,再选择ArcGIS类别中的 mand模板,输入类名为 .cs首先添加usingSystem.Windows.Forms;usingESRI.ArcGIS.Carto;privateControlsSynchronizerm_controlsSynchronizer={//TODO:Definevaluesforthepublicbase.m_category="Generic";//localizabletextbase.m_caption="Open"; //localizabletextbase.m_message="Thisshouldworkin//localizablebase.m_toolTip= //localizable m_controlsSynchronizer=controlsSynchronizer;{//TODO:changebitmapnameifstringbitmapResourceName=GetType().Name+".bmp";base.m_bitmap=newBitmap(GetType(),bitmapResourceName);}catch(Exception{ ine(ex.Message,"Invalid}}publicoverridevoid{//TODO:AddOpenNewMap .OnClickimplementationOpenFileDialogdlg=newOpenFileDialog();dlg.Filter="Map s(*.mxd)|*.mxd";dlg.Multiselect=false;dlg.Title="Open if(dlg.ShowDialog()=={ ame=IMapmapDoc=newMapif ame)&& { ame,string.Empty);IMapmap=mapDoc.get_Map(0);}}} privateControlsSynchronizerm_controlsSynchronizer=//controlssynchronizationcalssm_controlsSynchronizer=newControlsSynchronizer(m_mapControlm_pageLayoutControl);//MapControlPageLayoutControl绑定起来(Map),//MapControlPageLayoutControlFrameworkControl// openMapDoc=newOpenNewMap ToolbarControl的属性中将其删除。////////////<param///<paramprivatevoidNew_Click(objectsender,EventArgs{DialogResultres=MessageBox.Show("?","",MessageBoxButtons.YesNo,MessageBoxIcon.Question);if(res=={ICommandcommand=newCo if(m_mapControl!=null)}IMapmap=newMapClass();map.Name="Map"; Filename=}//////Mxd//////<param///<paramprivatevoidOpen_Click(objectsender,EventArgs{if(this.axMapControl1.LayerCount>{DialogResultresultMessageBox.Show("是否保存当前地图?警告",MessageBoxButtons.YesNoCancel,MessageBoxIcon.Question);if(result==DialogResult.Cancel)} openMapDoc=new }在添加数据AddDataAddData_ClickIMappMap=this.axMapControl1.Map;////////////<param///<paramprivatevoidSaveAs_Click(objectsender,EventArgs{{if(MessageBox.Show("另存为地图文档将丢失制版视图的设置\r\n您要继续吗提示MessageBoxButtons.YesNo,MessageBoxIcon.Question)DialogResult.No)}ICommandcommand=newCo }tabControl2控件,再选择////////////<param///<param{if(this.tabControl2.SelectedIndex=={}5

}{}

//MapControl//PageLayoutControlF5MapControl和PageLayoutControl第四讲状态栏信息的添加与实在上一讲中,我们完成了MapControl和PageLayoutControl两种视图的同步工作,本讲完成GIS应用程序一般也在状态1在设计视图中,点击窗体中的状态栏,在其属性面板中找到“Items”项,单击其右边的按钮,在StatusLabelStatusLabel,依次修改属性参数NameTextSpring1234Tips(BlankSpring属性表示可以按状态栏剩余空间自动伸缩。所以加入Blank项目,只是为了占个位子,以达到ScaleLabel和Coordina abel项目右对齐而MessageLabel项目左对齐的目的。2首先添加axToolbarControl1的OnMouseMove事件(相信大家看了以上的,已经知道怎么添加事件了吧,还不知道的建议再温习下前几讲的内容)。在其事件响应函数代码如下: IToolbarControlEvents_OnMouseMoveEvente){//intindex=axToolbarControl1.HitTest(e.x,e.y,false);if(index!=-1){//IToolbarItemtoolbarItem=// }{MessageLabel.Text="}}3axMapControl1OnMouseMove{//ScaleLabel.Text="1}4显示当前坐标也 axMapControl1 OnMouseMove事件中响应,故只要// abel.Text="X="+e.mapX.ToString()+"Y="+e.mapY.ToString()+""+F5编译运行,可以看到,我们的程序已经能够正常工作了。但是细心的你可能会发现,当前坐esriUnknownUnitsesriMeters”之类,即系统在正常单位的前面加上了“esrisMapUnitsprivatestringForm1_LoadsMapUnits=添加axMapControl1控件的OnMapReplaced事件,在事件响应函数中进行坐标单位替换,代码如privatevoidaxMapControl1_OnMapReplaced(objectsender,IMapControlEvents2_OnMapReplacedEvent{esriUnitsmapUnits=axMapControl1.MapUnits;switch(mapUnits){caseesriUnits.esriCentimeters:sMapUnits="Centimeters";caseesriUnits.esriDecimalDegrees:sMapUnits="DecimalDegrees";caseesriUnits.esriDecimeters:sMapUnits="Decimeters";caseesriUnits.esriFeet:sMapUnits="Feet";caseesriUnits.esriInches:sMapUnits="Inches";caseesriUnits.esriKilometers:sMapUnits="Kilometers";caseesriUnits.esriMeters:sMapUnits="Meters";caseesriUnits.esri:sMapUnits="";caseesriUnits.esriMillimeters:sMapUnits="Millimeters";caseesriUnits.esriNautical sMapUnits="Nautical caseesriUnits.esriPoints:sMapUnits="Points";caseesriUnits.esriUnknownUnits:sMapUnits="Unknown";sMapUnits="Yards";}}5F5StatusStripAE中当所用工具信息、当前比例尺和当前坐眼的MapControlMapControlMapControl互动。本讲最终效果1由于本在第一讲中没有预先考虑到鹰眼所放的位置,故我们要先稍微调整一下程序框架,并添加一个MapControl用于显示鹰眼。(1)tabControl1Dock属性设为None,并用鼠标拖拽将其缩小。把工具箱中的SplitContainer控件拖到窗体的左窗格,即放在tabControl1控件的旁边。并将其Orientation属性设置为Horizontal。(2tabControl1Ctrl+XSplitContainer2Panel1中,如图2所示。操作完成后效果如图3所示。图图(3)SplitContainer2控件(SplitContainer2DockFilltabControl1DockFill(4)MapControlSplitContainer2Panel2,作为鹰眼控件。最终效果如图4所示。图(1)MapaxMapControl1_OnMapReplaced事件响{////this.axMapControl2.Map=new//for(inti=1;i<=this.axMapControl1.LayerCount;{}//MapControlthis.axMapControl2.Extent=//}(2)MapControl1OnExtentUpdatedMap控件的显示范围改变时 IMapControlEvents2_OnExtentUpdatedEvente){//IEnvelopepEnv=IGraphicsContainerpGra=axMapControl2.MapasIGraphicsContainer;IActiveViewpAv=pGraasIActiveView;//axMapControl2IRectangleElementpRectangleEle=newRectangleElementClass();IElementpEle=pRectangleEleasIElement;pEle.Geometry=//IRgbColorpColor=newRgbColorClass();pColor.Red=255;pColor.Green=pColor.Blue=//ILineSymbolpOutline=newSimpleLineSymbolClass();pOutline.Width=2;pOutline.Color=//pColor=newRgbColorClass();pColor.Red=255;pColor.Green=pColor.Blue=//IFillSymbolpFillSymbol=newSimpleFillSymbolClass();pFillSymbol.Color=pColor;pFillSymbol.Outline=IFillShapeElementpFillShapeEle=pEleasIFillShapeElement;pFillShapeEle.Symbol=pFillSymbol;pGra.AddElement((IElement)pFillShapeEle,0);//}(3)MapMapControl2OnMouseDown{if(this.axMapControl2.Map.LayerCount!={//if(e.button=={IPointpPoint=newPointClass();pPoint.PutCoords(e.mapX,e.mapY);IEnvelopepEnvelope=this.axMapControl1.Extent;this.axMapControl1.Extent=pEnvelope;}//elseif(e.button=={IEnvelopepEnvelop=this.axMapControl2.TrackRectangle();this.axMapControl1.Extent=pEnvelop;}}}MapControl2OnMouseMove事件,主要实现按下鼠标左键的时候移动矩形框,同{//if(e.button!=1)IPointpPoint=newPointClass();pPoint.PutCoords(e.mapX,e.mapY);}1F5键菜单添加与实privateITOCControl2m_tocControl=//TOCControlMapprivate Map=private Layer= Map=newToolbar Layer=newToolbar 单容器才能工作一般情况下启动程序就要完成菜单项的添加故此工作在Form1_Load函数完成。义的。AE内置了许多可以直接调用的常用命令和工具,如 ESRI.ArcGIS.Controls命名空间中,大家可以对象浏览器中查看。当然,这里也可以直接调用AE内置的菜单,如ControlsFeatureSelection。另外,本讲也实现三自定义命令,以做示范。它们分别,LayerVisibility代码:usingESRI.ArcGIS.ADF.BaseClasses;usingESRI.ArcGIS.Controls;usingESRI.ArcGIS.Carto;usingESRI.ArcGIS.SystemUI;namespace_sdnMap{/////////publicsealedclassLayerVisibility mand,{privateIHookHelperm_hookHelper=newHookHelperClass();privatelongm_subType;public{}publicoverridevoid{for(inti=0;i<=m_hookHelper.FocusMap.LayerCount-1;{

if(m_subType==1)m_hookHelper.FocusMap.get_Layer(i).Visible=if(m_subType==2)m_hookHelper.FocusMap.get_Layer(i).Visible}}publicoverridevoidOnCreate(object{}publicint{return}publicvoidSetSubType(int{m_subType=}publicoverridestring{{if(m_subType==1)return"TurnAllLayersOn"; return"TurnAllLayersOff";}}publicoverridebool{{boolenabled=false;inti;if(m_subType==1){{{}}{

enabled=true;}{{enabled=true;}}}return}}}}usingESRI.ArcGIS.Carto;usingESRI.ArcGIS.Controls;namespace_sdnMap{/////////publicsealedclassRemoveLayer {privateIMapControl3m_mapControl;publicRemoveLayer(){base.m_caption="Remove}publicoverridevoid{ILayerlayer=(ILayer)m_mapControl.CustomProperty;}publicoverridevoidOnCreate(object{m_mapControl=}}}放大至整个图层类usingESRI.ArcGIS.Carto;usingESRI.ArcGIS.Controls;namespace_sdnMap{/////////publicsealedclassZoomToLayer {privateIMapControl3public{base.m_caption="ZoomTo}publicoverridevoid{ILayerlayer=(ILayer)m_mapControl.CustomProperty;m_mapControl.Extent=layer.AreaOfInterest;}publicoverridevoidOnCreate(object{m_mapControl=}}}Form1_Load函数中进行菜单项的添加,代码如下: ",4, ",5, Layer=new 顾名思义,右键菜单是在鼠标右键按下的时候弹出,所以我们要添加TOCControl1控件的 ITOCControlEvents_OnMouseDownEvente){if(e.button!=2)return;esriTOCControlItemitem=esriTOCControlItem.esriTOCControlItemNone;IBasicMapmap=null;ILayerlayer=null;objectother=null;objectindex=m_tocControl.HitTest(e.x,e.y,refitem,refmap,reflayer,refother,refif(item==esriTOCControlItem.esriTOCControlItemMap)m_tocControl.SelectItem(map,null);//CustomPropertylayer用于自定义的Layer命令)m_mapControl.CustomProperty=layer;if(item== Map.Popup(e.x,e.y,m_tocControl.hWnd);if(item==esriTOCControlItem.esriTOCControlItemLayer) }////////////<param///<param{if(e.button=={ }}F5编译运行程序,你会发现,原来右键菜单实现起来是这么的简单啊!到第六讲为止已经发现的Bug及解决方法如下:m_tocControlm_tocControlaxTOCControl1控件绑定,导致调用m_Map.Popup(e.x,e.y,m_tocControl.hWnd);时m_tocControl.hWnd为NULL,故无Form1_Load()函数中,添加如下代码:m_tocControl(ITOCControl2)this.axTOCControl1.Object;Coordinaabel.Text="当前坐标X="+e.mapX.ToString()+"Y="+e.mapY.ToString()+""+2、第四讲,固定状态栏中的比例尺和当前坐标项目的宽度以防止闪烁。autoSizeFalseSize属性里设置宽度。150400比较合适。第七讲图层符号选择器的实现在上一讲中,我们实现了右键菜单(Context)的添加与实现,在最后我预留给下一讲的问题是TOCControlTOCControl的属性页中,勾选“EnableLayerDragandDrop”即可。ArcMapSymbolSelector的类似。本讲较前几讲1通过对《ArcGISEngine+C#实例开发》前六讲的学习,我已经假定你已经基本熟悉C#语言和VS2005的操作故在下面的中我备说明每一步骤的具体操作方法而只是说明操作步骤,直接调用ArcMap添加ESRI.ArcGIS.DisplayUI的。分别在解决方案管理器和代码中添加。TOCControl的Double_ClickTOCControl的Double_Click因为种方法不是本讲的重点,故不对代码进行分析,有的读者请自行理解或结合后面的内容理{esriTOCControlItemtoccItem=esriTOCControlItem.esriTOCControlItemNone;ILayeriLayer=null;IBasicMapiBasicMap=null;objectunk=null;objectdata=null;if(e.button==1){axTOCControl1.HitTest(e.x,e.y,reftoccItem,refiBasicMap,refiLayer,refunk,refdata);System.Drawing.Pointpos=newSystem.Drawing.Point(e.x,if(toccItem=={ESRI.ArcGIS.Carto.ILegendClasspLC=newLegendClassClass();ESRI.ArcGIS.Carto.ILegendGrouppLG=newLegendGroupClass();if(unkisILegendGroup){pLG=}pLC=pLG.get_Class((int)data);ISymbolpSym;pSym=pLC.Symbol;ESRI.ArcGIS.DisplayUI.ISymbolSelectorpSS=newboolbOK=false;bOK=pSS.SelectSymbol(0);if(bOK){pLC.Symbol=}}}}AE9.2SymbologyControl控件,极大的方便了图层符号选择器的制作。本讲实现的符号选择符(*.ServerStyle,加载的符号。新建Winodws窗体,命名为SymbolSelectorFrm,修改窗体的TextContextStrip控件。控件布局如下所示:ArcGISEngine的ESRI.ArcGIS.GeodatabaseSymbolSelectorFrm.cs文件中添加如下代码usingusingESRI.ArcGIS.Display;usingESRI.ArcGIS.esriSystem;usingESRI.ArcGIS.SystemUI;usingESRI.ArcGIS.Controls;usingESRI.ArcGIS.Geodatabase;privateIStyleGalleryItempStyleGalleryItem;privateILegendClasspLegendClass;privateILayerpLayer;publicISymbolpSymbol;publicImage//////构造函数,///<paramname="tempLegendClass">TOC图例<paramname="tempLayer">图层{this.pLegendClass=tempLegendClass;this.pLayer=tempLayer;}添加SymbolControl的SymbologyStyleClass设置函数SetFeatureClassStyle()//////初始化SymbologyControl的StyleClass,图层如果已有符号,SymbologyControl中的//////<param{ if(this.pLegendClass!={IStyleGalleryItemcurrentStyleGalleryItemnewServerStyleGalleryItem();currentStyleGalleryItem.Name="当前符号";currentStyleGalleryItem.Item=pLegendClass.Symbol;this.pStyleGalleryItem=currentStyleGalleryItem;}}//////从表中取得指定软件的路//////<param///privatestringReadRegistry(string{//Openthesubkeyfor.Win32.RegistryKeyrk= if(rk==null)return"";//Getthedatafromaspecifiediteminthekey.return(string)rk.GetValue("InstallDir");}privatevoidSymbolSelectorFrm_Load(objectsender,EventArgs{//ArcGISstringsInstall=//ESRI.ServerStyleSymbologyControlthis.axSymbologyControl.LoadStyleFile(sInstallStyles\\ESRI.ServerStyle");//确定图层的类型(点线面),SymbologyControlStyleClass,设置好各控件的可见性(visible)IGeoFeatureLayerpGeoFeatureLayer=(IGeoFeatureLayer)pLayer;switch{caseESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPoint:this.lblAngle.Visible=true;this.nudAngle.Visible=true;this.lblSize.Visible=true;this.nudSize.Visible=true;this.lblWidth.Visible=false;this.nudWidth.Visible=false;this.lblOutlineColor.Visible=false;caseESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolyline:this.lblAngle.Visible=false;this.nudAngle.Visible=false;this.lblSize.Visible=false;this.nudSize.Visible=false;this.lblWidth.Visible=true;this.nudWidth.Visible=true;this.lblOutlineColor.Visible=false;caseESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolygon:this.lblAngle.Visible=false;this.nudAngle.Visible=false;this.lblSize.Visible=false;this.nudSize.Visible=false;this.lblWidth.Visible=true;this.nudWidth.Visible=true;this.lblOutlineColor.Visible=true;this.btnOutlineColor.Visible=true;caseESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryMultiPatch:this.lblAngle.Visible=false;this.nudAngle.Visible=false;this.lblSize.Visible=false;this.nudSize.Visible=false;this.lblWidth.Visible=true;this.nudWidth.Visible=true;this.lblOutlineColor.Visible=true;this.btnOutlineColor.Visible=true;}}////////////<param///<paramprivatevoidbtnOK_Click(objectsender,EventArgs{this.pSymbol=this.pSymbolImage=}////////////<param///<paramprivatevoidbtnCancel_Click(objectsender,EventArgs{}////////////<param///<param ESRI.ArcGIS.Controls.ISymbologyControlEvents_OnDoubleClickEvente){}//////picturebox///privatevoid{ tem,this.ptbPreview.Width,this.ptbPreview.Height); }SymbologyControl的样式改变时,需要重新设置符号参数调整控件的可视性,故要SymbologyControlOnStyleClassChangedLoad事件类似,如下://////当样式(Style)//////<param///<param ESRI.ArcGIS.Controls.ISymbologyControlEvents_OnStyleClassChangedEvente){switch{caseesriSymbologyStyleClass.esriStyleClassMarkerSymbols:this.lblAngle.Visible=true;this.nudAngle.Visible=true;this.lblSize.Visible=true;this.nudSize.Visible=true;this.lblWidth.Visible=false;this.nudWidth.Visible=false;this.lblOutlineColor.Visible=false;this.btnOutlineColor.Visible=false;caseesriSymbologyStyleClass.esriStyleClassLineSymbols:this.lblAngle.Visible=false;this.nudAngle.Visible=false;this.lblSize.Visible=false;this.nudSize.Visible=false;this.lblWidth.Visible=true;this.nudWidth.Visible=true;this.lblOutlineColor.Visible=false;this.btnOutlineColor.Visible=false;caseesriSymbologyStyleClass.esriStyleClassFillSymbols:this.lblAngle.Visible=false;this.nudAngle.Visible=false;this.lblSize.Visible=false;this.nudSize.Visible=false;this.lblWidth.Visible=true;this.nudWidth.Visible=true;this.lblOutlineColor.Visible=true;this.btnOutlineColor.Visible=true;}}通过以上操作,本符号选择器雏形已经完成,我们可以3sdnMap主窗体中调用并进试。如果您axTOCControl1控件的OnDoubleClick事件,再添加如下事件响应函数代码://////TOCControl//////<param///<param{esriTOCControlItemitemType=esriTOCControlItem.esriTOCControlItemNone;IBasicMapbasicMap=null;ILayerlayer=null;objectunk=null;objectdata=null;axTOCControl1.HitTest(e.x,e.y,refitemType,refbasicMap,reflayer,refunk,refdata);if(e.button==1){{

ILegendClasspLegendClass=SymbolSelectorFrmSymbolSelectorFrm=new{pLegendClass.Symbol=//Map控件和图层控件}}}SymbologyControlOnItemSelected事件,此事件在鼠标选中符号时触发,此时////////////<param///<param ESRI.ArcGIS.Controls.ISymbologyControlEvents_OnItemSelectedEvente){pStyleGalleryItem=(IStyleGalleryItem)e.styleGalleryItem;Colorcolor;switch{casecolor=this.ConvertIRgbColorToColor(((IMarkerSymbol)pStyleGalleryItem.Item).Color

this.nudSize.Value=(decimal)((IMarkerSymbol)this.pStyleGalleryItem.Item).Size;casecolor=this.ConvertIRgbColorToColor(((ILineSymbol)pStyleGalleryItem.Item).Color

case color=Color.Black;}this.btnColor.BackColorcolor;}nudSizeValueChanged事件,即在控件的值改变时响应此事件,然后重新设置点符号的//////调整符号大小-//////<param///<param{}//////调整符号角度-//////<param///<param{((IMarkerSymbol)this.pStyleGalleryItem.Item).Angle=(double)this.nudAngle.Value;}//////调整符号宽度-//////<param///<param{switch{caseesriSymbologyStyleClass.esriStyleClassLineSymbols: caseILineSymbolpLineSymbol=((IFillSymbol)this.pStyleGalleryItem.Item).Outline;pLineSymbol.Width=Convert.ToDouble(this.nudWidth.Value);((IFillSymbol)this.pStyleGalleryItem.Item).Outline=pLineSymbol;}}在调整颜色参数之前,须完成以上两种不同颜色表示方式的转换。关于这两种颜色结构的具ArcGISEngineIRgbColor接口转换至.NETColor//////ArcGISEngineIRgbColor接口转换至.NETColor//////<paramreturns>.NETSystem.Drawing.ColorARGB颜色</returns>publicColorConvertIRgbColorToColor(IRgbColorpRgbColor){return}.NETColorArcGISEngine中的IColor//////将.NETColorArcGISEngineIColor///<paramname="color">.NETSystem.Drawing.ColorARGB颜色///{IColorpColor=newpColor.RGB=color.B*65536+color.G*256+color.R;returnpColor;}btnColor按钮,添加如下代码:////////////<param///<paramprivatevoidbtnColor_Click(objectsender,EventArgs{if(this.colorDialog.ShowDialog()=={this.btnColor.BackColor=this.colorDialog.Color;switch{caseesriSymbologyStyleClass.esriStyleClassMarkerSymbols: caseesriSymbologyStyleClass.esriStyleClassLineSymbols: caseesriSymbologyStyleClass.esriStyleClassFillSymbols: }}}同上一步类似,双击btnOutlineColor////////////<param///<paramprivatevoidbtnOutlineColor_Click(objectsender,EventArgs{if(this.colorDialog.ShowDialog()=={ILineSymbolpLineSymbol=pLineSymbol.Color=((IFillSymbol)this.pStyleGalleryItem.Item).OutlinepLineSymbol;}}已经注意到,ArcMapSymbolSelector有一个“MoreSymbols”按钮,可以加载其它的符号和ServerStyle文件。3sdnMap

功能是:单击“符号”弹出菜单(Context菜单中列出了ArcGIS自带的其它符号,勾选boolcontextMoreSymbolInitiated=在此事件响应函数中,我们要完成ServerStyle文件的,将其文件名作为菜单项名称生成菜单并//////“符号”按下时触发的事//////<param///<paramprivatevoidbtnMoreSymbols_Click(objectsender,EventArgs{if MoreSymbolInitiated=={

stringsInstall=ReadRegistry("SOFTWARE\\ESRI\\CoreRuntime");stringpath= bine(sInstall,"Styles"); Item=new Item[styleNames.Lengthfor(inti=0;i<styleNames.Length;{symbolContextItem[i]=newToolStrip symbolContextItem[i].CheckOnClick=true; if(symbolContextItem[i].Text=="ESRI"){ Item[i].Checked=}symbolContextItem[i].Name=}symbolContextItem[styleNames.Length]=newToolStripItem();symbolContextItem[styleNames.Length].Text="添加符号";symbolContextItem[styleNames.Length].Name="AddMoreSymbol"; this.contextMoreSymbolInitiated=true;} }添加

温馨提示

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

评论

0/150

提交评论