《第七讲 图层符号选择器的实现1》由会员分享,可在线阅读,更多相关《第七讲 图层符号选择器的实现1(15页珍藏版)》请在金锄头文库上搜索。
1、ArcGIS Engine+C# 实例开发教程 第七讲 图层符号选择器的实现 1 时间:2009-04-18 03:58:46 来源:3SDN.Net 作者:3SDN 原创 点击量:869 u 版权声明:ArcGIS Engine+C#实例开发教程为 3SDN(http:/)原创教程,作者闲云野鹤,版权所有。禁止商业用途转载(如需请联系作者) ,非商业用途转载请注明出处并完整保留本声明。u 读者对象:使用 C#开发 ArcGIS Engine(以下简称 AE)的初学者。u 预备知识:了解 AE 基本体系,了解 C#基本语法,了解 VS2005 的基本使用方法。u 预期学习效果:进一步理解 AE
2、 的体系结构与开发方法,掌握基本的 GIS 桌面应用程序的开发。在上一讲中,我们实现了右键菜单(ContextMenu)的添加与实现,在最后我预留给下一讲的问题是 TOCControl 控件图层拖拽的实现。后来发现此功能的实现异常简单,只要在TOCControl 的属性页中,勾选“Enable Layer Drag and Drop”即可。教程 Bug 及优化方案 1 查看这里。这一讲,我们要实现的是图层符号选择器,与 ArcMap 中的 Symbol Selector 的类似。本讲较前几讲而言,些许有些复杂,不过只要仔细琢磨,认真操作,你就很容易实现如下所示的符号选择器。因为本讲篇幅较长,故
3、我将其分成两个阶段,本文是第一阶段。图 1 在 AE 开发中,符号选择器有两种实现方式。一是在程序中直接调用 ArcMap 中的符号选择器,如下所示:图 2二是自定义符号选择器,如图 1 所示。由于第一种方式前提是必须安装 ArcGIS Desktop,其界面还是英文的,而对二次开发来说,大部分用户希望应该是中文界面。因此开发人员通常选择第二种方式,本讲也着重讲解第二种方式。通过对ArcGIS Engine+C#实例开发教程前六讲的学习,我已经假定你已经基本熟悉 C#语言和 VS2005 的操作,故在下面的教程中,我不准备说明每一步骤的具体操作方法,而只是说明操作步骤,以节省时间和篇幅。本篇文
4、章来源于 3SDN 转载请以链接形式注明出处 网址:http:/ 直接调用 ArcMap 中的符号选择器(1)添加 ESRI.ArcGIS.DisplayUI 的引用。分别在解决方案管理器和代码中添加引用。(2)添加 TOCControl 的 Double_Click 事件。(3)实现 TOCControl 的 Double_Click 事件。因为种方法不是本讲的重点,故不对代码进行分析,有兴趣的读者请自行理解或结合后面的内容理解。代码如下:private void axTOCControl1_OnDoubleClick(object sender, ITOCControlEvents_OnD
5、oubleClickEvent e) esriTOCControlItem toccItem = esriTOCControlItem.esriTOCControlItemNone;ILayer iLayer = null;IBasicMap iBasicMap = null;object unk = null;object data = null;if (e.button = 1)axTOCControl1.HitTest(e.x, e.y, ref toccItem, ref iBasicMap, ref iLayer, ref unk,ref data);System.Drawing.P
6、oint pos = new System.Drawing.Point(e.x, e.y);if (toccItem = esriTOCControlItem.esriTOCControlItemLegendClass)ESRI.ArcGIS.Carto.ILegendClass pLC = new LegendClassClass();ESRI.ArcGIS.Carto.ILegendGroup pLG = new LegendGroupClass();if (unk is ILegendGroup) pLG = (ILegendGroup)unk;pLC = pLG.get_Class(i
7、nt)data);ISymbol pSym;pSym = pLC.Symbol;ESRI.ArcGIS.DisplayUI.ISymbolSelector pSS = newESRI.ArcGIS.DisplayUI.SymbolSelectorClass();bool bOK = false;pSS.AddSymbol(pSym);bOK = pSS.SelectSymbol(0);if (bOK)pLC.Symbol = pSS.GetSymbolAt(0);this.axMapControl1.ActiveView.Refresh();this.axTOCControl1.Refresh
8、();(4)编译运行即可。本篇文章来源于 3SDN 转载请以链接形式注明出处 网址:http:/ 自定义符号选择器AE9.2 提供了 SymbologyControl 控件,极大的方便了图层符号选择器的制作。本讲实现的符号选择器有如下功能。用户双击 TOCControl 控件中图层的符号时,弹出选择符号对话框,对话框能够根据图层类型自动加载相应的符号,如点、线、面。用户可以调整符号的颜色、线宽、角度等参数。还可以打开自定义的符号文件(*.ServerStyle) ,加载更多的符号。2.1 新建符号选择器窗体新建 Winodws 窗体,命名为 SymbolSelectorFrm,修改窗体的 Te
9、xt 属性为“选择符号” 。并添加SymboloryControl、PictureBox、Button、Label 、NumericUpDown 、GroupBox、ColorDialog、OpenFileDialog、ContextMenuStrip 控件。控件布局如下所示:图 32.2 设置控件属性设置相应控件的相关属性,如下表所示(空则不用修改) :控件 Name 属性 Text 属性 其它SymbologyControl axSymbologyControlPictureBox ptbPreviewLabel lblColor 颜色Label lblSize 大小Label lblWi
10、dth 线宽Label lblAngle 角度Label lblOutlineColor 外框颜色NumericUpDown nudSizeNumericUpDown nudWidthNumericUpDown nudAngleButton btnColor (设置为空)Button btnOutlineColor (设置为空)Button btnMoreSymbols 更多符号Button btnOK 确定 DialogResult 属性设为 OKButton btnCancel 取消GroupBox groupBox1 预览GroupBox groupBox2 设置 ColorDialog
11、 colorDialogOpenFileDialog openFileDialogFilter 属性设置为:Styles 文件 |*.ServerStyleContextMenuStrip contextMenuStripMoreSymbol2.3 添加引用在解决方案资源管理器中添加 ArcGIS Engine 的 ESRI.ArcGIS.Geodatabase 引用,在SymbolSelectorFrm.cs 文件中添加如下引用代码:using ESRI.ArcGIS.Carto; using ESRI.ArcGIS.Display;using ESRI.ArcGIS.esriSystem;
12、using ESRI.ArcGIS.SystemUI;using ESRI.ArcGIS.Controls;using ESRI.ArcGIS.Geodatabase;本篇文章来源于 3SDN 转载请以链接形式注明出处 网址:http:/ 初始化(1) 添加 SymbolSelectorFrm 的全局变量,代码如下:private IStyleGalleryItem pStyleGalleryItem;private ILegendClass pLegendClass;private ILayer pLayer;public ISymbol pSymbol;public Image pSymb
13、olImage;(2) 修改 SymbolSelectorFrm 的构造函数,传入图层和图例接口。代码如下:/ / 构造函数,初始化全局变量/ / TOC 图例/ 图层public SymbolSelectorFrm(ILegendClass tempLegendClass, ILayer tempLayer)InitializeComponent(); this.pLegendClass = tempLegendClass;this.pLayer = tempLayer;(3) 添加 SymbolControl 的 SymbologyStyleClass 设置函数 SetFeatureCla
14、ssStyle(),代码如下:/ / 初始化 SymbologyControl 的 StyleClass,图层如果已有符号,则把符号添加到SymbologyControl 中的第一个符号,并选中/ / private void SetFeatureClassStyle(esriSymbologyStyleClass symbologyStyleClass)this.axSymbologyControl.StyleClass = symbologyStyleClass;ISymbologyStyleClass pSymbologyStyleClass = this.axSymbologyCont
15、rol.GetStyleClass(symbologyStyleClass);if (this.pLegendClass != null)IStyleGalleryItem currentStyleGalleryItem = new ServerStyleGalleryItem();currentStyleGalleryItem.Name = 当前符号;currentStyleGalleryItem.Item = pLegendClass.Symbol;pSymbologyStyleClass.AddItem(currentStyleGalleryItem,0);this.pStyleGalleryItem = currentStyleGalleryItem;pSymbologyStyleClass.SelectItem(0);(4) 添加注册表读取函数 ReadRegistry(),此函数从注册表中读取 ArcGIS 的安装路径,代码如下:/ / 从注册表中取得指定软件的路径/ / / private string Re