《ArcGIS Engine+C#实例开发教程》第七讲 图层符号选择器的实现2
原文:《ArcGIS Engine+C#实例开发教程》第七讲 图层符号选择器的实现2
教程目录:
第三讲 MapControl与PageLayoutControl同步
------------------------------------------------------------------
《ArcGIS Engine+C#实例开发教程》为3SDN(http://www.3sdn.net)原创教程,作者闲云野鹤,版权所有。禁止商业用途转载(如需请联系作者),非商业用途转载请注明出处并完整保留本声明。
在第七讲 图层符号选择器的实现的第一阶段中,我们完成了符号选择器窗体的创建与调用。在第二阶段中,我们继续完成符号参数的调整与“更多符号”的加载。
2.6 符号参数调整
在地图整饰中,符号参数的调整是必须的功能。下面我们将实现符号颜色、外框颜色、线宽、角度等参数的调整。
(1) 添加SymbologyControl的OnItemSelected事件,此事件在鼠标选中符号时触发,此时显示出选定符号的初始参数,事件响应函数代码如下:
|
/// <summary> /// 选中符号时触发的事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void axSymbologyControl_OnItemSelected(object sender, ESRI.ArcGIS.Controls.ISymbologyControlEvents_OnItemSelectedEvent e) { pStyleGalleryItem = (IStyleGalleryItem)e.styleGalleryItem; Color color; switch (this.axSymbologyControl.StyleClass) { //点符号 case esriSymbologyStyleClass.esriStyleClassMarkerSymbols: color = this.ConvertIRgbColorToColor(((IMarkerSymbol)pStyleGalleryItem.Item).Color as IRgbColor); //设置点符号角度和大小初始值 this.nudAngle.Value = (decimal)((IMarkerSymbol)this.pStyleGalleryItem.Item).Angle; this.nudSize.Value = (decimal)((IMarkerSymbol)this.pStyleGalleryItem.Item).Size; break; //线符号 case esriSymbologyStyleClass.esriStyleClassLineSymbols: color = this.ConvertIRgbColorToColor(((ILineSymbol)pStyleGalleryItem.Item).Color as IRgbColor); //设置线宽初始值 this.nudWidth.Value = (decimal)((ILineSymbol)this.pStyleGalleryItem.Item).Width; break; //面符号 case esriSymbologyStyleClass.esriStyleClassFillSymbols: color = this.ConvertIRgbColorToColor(((IFillSymbol)pStyleGalleryItem.Item).Color as IRgbColor); this.btnOutlineColor.BackColor = this.ConvertIRgbColorToColor(((IFillSymbol)pStyleGalleryItem.Item).Outline.Color as IRgbColor); //设置外框线宽度初始值 this.nudWidth.Value = (decimal)((IFillSymbol)this.pStyleGalleryItem.Item).Outline.Width; break; default: color = Color.Black; break; } //设置按钮背景色 this.btnColor.BackColor = color; //预览符号 this.PreviewImage(); } |
(2) 调整点符号的大小
添加nudSize控件的ValueChanged事件,即在控件的值改变时响应此事件,然后重新设置点符号的大小。代码如下:
| /// <summary>
/// 调整符号大小-点符号 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void nudSize_ValueChanged(object sender, EventArgs e) { ((IMarkerSymbol)this.pStyleGalleryItem.Item).Size = (double)this.nudSize.Value; this.PreviewImage(); } |
(3) 调整点符号的角度
添加nudAngle控件的ValueChanged事件,以重新设置点符号的角度。代码如下:
| /// <summary>
/// 调整符号角度-点符号 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void nudAngle_ValueChanged(object sender, EventArgs e) { ((IMarkerSymbol)this.pStyleGalleryItem.Item).Angle = (double)this.nudAngle.Value; this.PreviewImage(); } |
(4) 调整线符号和面符号的线宽
添加nudWidth控件的ValueChanged事件,以重新设置线符号的线宽和面符号的外框线的线宽。代码如下:
|
/// <summary> /// 调整符号宽度-限于线符号和面符号 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void nudWidth_ValueChanged(object sender, EventArgs e) { switch (this.axSymbologyControl.StyleClass) { case esriSymbologyStyleClass.esriStyleClassLineSymbols: ((ILineSymbol)this.pStyleGalleryItem.Item).Width = Convert.ToDouble(this.nudWidth.Value); break; case esriSymbologyStyleClass.esriStyleClassFillSymbols: //取得面符号的轮廓线符号 ILineSymbol pLineSymbol = ((IFillSymbol)this.pStyleGalleryItem.Item).Outline; pLineSymbol.Width = Convert.ToDouble(this.nudWidth.Value); ((IFillSymbol)this.pStyleGalleryItem.Item).Outline = pLineSymbol; break; } this.PreviewImage(); } |
(5) 颜色转换
在ArcGIS Engine中,颜色由IRgbColor接口实现,而在.NET框架中,颜色则由Color结构表示。故在调整颜色参数之前,我们必须完成以上两种不同颜色表示方式的转换。关于这两种颜色结构的具体信息,请大家自行查阅相关资料。下面添加两个颜色转换函数。
ArcGIS Engine中的IRgbColor接口转换至.NET中的Color结构的函数:
| /// <summary>
/// 将ArcGIS Engine中的IRgbColor接口转换至.NET中的Color结构 /// </summary> /// <param name="pRgbColor">IRgbColor</param> /// <returns>.NET中的System.Drawing.Color结构表示ARGB颜色</returns> public Color ConvertIRgbColorToColor(IRgbColor pRgbColor) { return ColorTranslator.FromOle(pRgbColor.RGB); } |
.NET中的Color结构转换至于ArcGIS Engine中的IColor接口的函数:
| /// <summary>
/// 将.NET中的Color结构转换至于ArcGIS Engine中的IColor接口 /// </summary> /// <param name="color">.NET中的System.Drawing.Color结构表示ARGB颜色</param> /// <returns>IColor</returns> public IColor ConvertColorToIColor(Color color) { IColor pColor = new RgbColorClass(); pColor.RGB = color.B * 65536 + color.G * 256 + color.R; return pColor; } |
(6) 调整所有符号的颜色
选择颜色时,我们调用.NET的颜色对话框ColorDialog,选定颜色后,修改颜色按钮的背景色为选定的颜色,以方便预览。双击btnColor按钮,添加如下代码:
|
/// <summary> /// 颜色按钮 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnColor_Click(object sender, EventArgs e) { //调用系统颜色对话框 if (this.colorDialog.ShowDialog() == DialogResult.OK) { //将颜色按钮的背景颜色设置为用户选定的颜色 this.btnColor.BackColor = this.colorDialog.Color; //设置符号颜色为用户选定的颜色 switch (this.axSymbologyControl.StyleClass) { //点符号 case esriSymbologyStyleClass.esriStyleClassMarkerSymbols: ((IMarkerSymbol)this.pStyleGalleryItem.Item).Color = this.ConvertColorToIColor(this.colorDialog.Color); break; //线符号 case esriSymbologyStyleClass.esriStyleClassLineSymbols: ((ILineSymbol)this.pStyleGalleryItem.Item).Color = this.ConvertColorToIColor(this.colorDialog.Color); break; //面符号 case esriSymbologyStyleClass.esriStyleClassFillSymbols: ((IFillSymbol)this.pStyleGalleryItem.Item).Color = this.ConvertColorToIColor(this.colorDialog.Color); break; } //更新符号预览 this.PreviewImage(); } } |
(7) 调整面符号的外框线颜色
同上一步类似,双击btnOutlineColor按钮,添加如下代码:
|
/// <summary> /// 外框颜色按钮 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnOutlineColor_Click(object sender, EventArgs e) { if (this.colorDialog.ShowDialog() == DialogResult.OK) { //取得面符号中的外框线符号 ILineSymbol pLineSymbol = ((IFillSymbol)this.pStyleGalleryItem.Item).Outline; //设置外框线颜色 pLineSymbol.Color = this.ConvertColorToIColor(this.colorDialog.Color); //重新设置面符号中的外框线符号 ((IFillSymbol)this.pStyleGalleryItem.Item).Outline = pLineSymbol; //设置按钮背景颜色 this.btnOutlineColor.BackColor = this.colorDialog.Color; //更新符号预览 this.PreviewImage(); } } |
至此,你可以编译运行程序,看看效果如何,是不是感觉很不错了?我们已经能够修改符号的参数,自定义符号了。
但是,SymbologyControl默认加载的是ESRI.ServerStyle文件的样式,用过ArcMap的你可能已经注意到,ArcMap中的Symbol Selector有一个“More Symbols”按钮,可以加载其它的符号和ServerStyle文件。3sdnMap当然“一个都不能少”。
2.7 添加更多符号菜单
还记得我们在开始的时候添加了ContextMenuStrip控件吗?现在它终于派上用场了。我们要实现的功能是:单击“更多符号”弹出菜单(ContextMenu),菜单中列出了ArcGIS自带的其它符号,勾选相应的菜单项就可以在SymbologyControl中增加相应的符号。在菜单的最后一项是“添加符号”,选择这一项时,将弹出打开文件对话框,我们可以由此选择其它的ServerStyle文件,以加载更多的符号。
(1) 定义全局变量
在SymbolSelectorFrm中定义如下全局变量,用于判断菜单是否已经初始化。
|
//菜单是否已经初始化标志 bool contextMenuMoreSymbolInitiated = false; |
(2) 双击“更多符号”按钮,添加Click事件。
在此事件响应函数中,我们要完成ServerStyle文件的读取,将其文件名作为菜单项名称生成菜单并显示菜单。代码如下:
|
/// <summary> /// “更多符号”按下时触发的事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnMoreSymbols_Click(object sender, EventArgs e) { if (this.contextMenuMoreSymbolInitiated == false) { string sInstall = ReadRegistry("SOFTWARE\\ESRI\\CoreRuntime"); string path = System.IO.Path.Combine(sInstall, "Styles"); //取得菜单项数量 string[] styleNames = System.IO.Directory.GetFiles(path, "*.ServerStyle"); ToolStripMenuItem[] symbolContextMenuItem = new ToolStripMenuItem[styleNames.Length + 1]; //循环添加其它符号菜单项到菜单 for (int i = 0; i < styleNames.Length; i++) { symbolContextMenuItem[i] = new ToolStripMenuItem(); symbolContextMenuItem[i].CheckOnClick = true; symbolContextMenuItem[i].Text = System.IO.Path.GetFileNameWithoutExtension(styleNames[i]); if (symbolContextMenuItem[i].Text == "ESRI") { symbolContextMenuItem[i].Checked = true; } symbolContextMenuItem[i].Name = styleNames[i]; } //添加“更多符号”菜单项到菜单最后一项 symbolContextMenuItem[styleNames.Length] = new ToolStripMenuItem(); symbolContextMenuItem[styleNames.Length].Text = "添加符号"; symbolContextMenuItem[styleNames.Length].Name = "AddMoreSymbol"; //添加所有的菜单项到菜单 this.contextMenuStripMoreSymbol.Items.AddRange(symbolContextMenuItem); this.contextMenuMoreSymbolInitiated = true; } //显示菜单 this.contextMenuStripMoreSymbol.Show(this.btnMoreSymbols.Location); } |
(3) 添加contextMenuStripMoreSymbol控件的ItemClicked事件。
当单击某一菜单项时响应ItemClicked事件,将选中的ServerStyle文件导入到SymbologyControl中并刷新。当用户单击“添加符号”菜单项时,弹出打开文件对话框,供用户选择其它的ServerStyle文件。代码如下:
|
/// <summary> /// “更多符号”按钮弹出的菜单项单击事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void contextMenuStripMoreSymbol_ItemClicked(object sender, ToolStripItemClickedEventArgs e) { ToolStripMenuItem pToolStripMenuItem = (ToolStripMenuItem)e.ClickedItem; //如果单击的是“添加符号” if (pToolStripMenuItem.Name == "AddMoreSymbol") { //弹出打开文件对话框 if (this.openFileDialog.ShowDialog() == DialogResult.OK) { //导入style file到SymbologyControl this.axSymbologyControl.LoadStyleFile(this.openFileDialog.FileName); //刷新axSymbologyControl控件 this.axSymbologyControl.Refresh(); } } else//如果是其它选项 { if (pToolStripMenuItem.Checked == false) { this.axSymbologyControl.LoadStyleFile(pToolStripMenuItem.Name); this.axSymbologyControl.Refresh(); } else { this.axSymbologyControl.RemoveFile(pToolStripMenuItem.Name); this.axSymbologyControl.Refresh(); } } } |
2.8 编译运行
相信你已经盼这一步很久了吧,按照惯例,按下F5吧!大功造成。
以上代码在AE9.2+VS2005+XP中编译通过。
《ArcGIS Engine+C#实例开发教程》第七讲 图层符号选择器的实现2的更多相关文章
- 《ArcGIS Engine+C#实例开发教程》第二讲 菜单的添加及其实现
原文:<ArcGIS Engine+C#实例开发教程>第二讲 菜单的添加及其实现 摘要:在上一讲中,我们实现了应用程序基本框架,其中有个小错误,在此先跟大家说明下.在“属性”选项卡中,我们 ...
- 《ArcGIS Engine+C#实例开发教程》第一讲桌面GIS应用程序框架的建立
原文:<ArcGIS Engine+C#实例开发教程>第一讲桌面GIS应用程序框架的建立 摘要:本讲主要是使用MapControl.PageLayoutControl.ToolbarCon ...
- 《ArcGIS Engine+C#实例开发教程》第八讲 属性数据表的查询显示
原文:<ArcGIS Engine+C#实例开发教程>第八讲 属性数据表的查询显示 第一讲 桌面GIS应用程序框架的建立 第二讲 菜单的添加及其实现 第三讲 MapControl与Page ...
- 《ArcGIS Engine+C#实例开发教程》第六讲 右键菜单添加与实现
原文:<ArcGIS Engine+C#实例开发教程>第六讲 右键菜单添加与实现 摘要:在这一讲中,大家将实现TOCControl控件和主地图控件的右键菜单.在AE开发中,右键菜单有两种实 ...
- 《ArcGIS Engine+C#实例开发教程》第四讲 状态栏信息的添加与实现
原文:<ArcGIS Engine+C#实例开发教程>第四讲 状态栏信息的添加与实现 摘要:在上一讲中,我们完成了 MapControl 和PageLayoutControl两种视图的同步 ...
- 《ArcGIS Engine+C#实例开发教程》第五讲 鹰眼的实现
原文:<ArcGIS Engine+C#实例开发教程>第五讲 鹰眼的实现 摘要:所谓的鹰眼,就是一个缩略地图,上面有一个矩形框,矩形框区域就是当前显示的地图区域,拖动矩形框可以改变当前地图 ...
- 《ArcGIS Engine+C#实例开发教程》第三讲 MapControl与PageLayoutControl同步
原文:<ArcGIS Engine+C#实例开发教程>第三讲 MapControl与PageLayoutControl同步 摘要:在ArcMap中,能够很方面地进行MapView和Layo ...
- 《ArcGIS Engine+C#实例开发教程》
原文:<ArcGIS Engine+C#实例开发教程> 摘要:<ArcGIS Engine+C#实例开发教程>,面向 ArcGIS Engine(以下简称AE)开发初学者,本教 ...
- Senparc.Weixin.MP SDK 微信公众平台开发教程(七):解决用户上下文(Session)问题
从这篇文章中我们已经了解了微信公众平台消息传递的方式,这种方式有一个先天的缺陷:不同用户的请求都来自同一个微信服务器,这使得常规的Session无法使用(始终面对同一个请求对象,况且还有对方服务器Co ...
随机推荐
- Android数据存储方式之SharedPreferences
Android平台给我们提供了一个SharedPreferences类,它是一个轻量级的存储类,特别适合用于保存软件配置参数.使用SharedPreferences保存数据,其背后是用xml文件存放数 ...
- [转]Windows Shell 编程 第三章 【转自:http://blog.csdn.net/wangqiulin123456/article/details/7987901】
第三章 操作文件 我依然清楚地记得,Windows95 的贝塔版出现的情形,它在朋友之间和学院中传播,好酷,全新的文件管理器,一种全图标,全彩色可客户化的界面,以及活泼的动画标识使得在文件拷贝和删除方 ...
- ubuntu系统安装flashplayer
打开浏览器,输入adobe flashplayer 进入官方网站,下载Linux 32-bit, 简体中文, Firefox,下载.tar.gz包. 然后点击立即下载.下载之后找到解压该文件夹,找到 ...
- C# ACM poj1003
这题很有内涵,先用简单方法 public static void acm1003(double a) { ) { return; } ; ) { / b; a = a - c; b++; } Cons ...
- [leetcode] 401. Binary Watch
https://leetcode.com/contest/5/problems/binary-watch/ 这个题应该是这次最水的,这个题目就是二进制,然后是10位,最大1024,然后遍历,找二进制里 ...
- linux下查看端口的连接数
linux下,可以通过natstat命令来查看端口的连接状况,比如连接数 例如,查看9090端口的连接状况: 查看某个端口的连接数netstat -nat | grep -iw "9090& ...
- php json_encode()和json_decode()
json_encode()和json_decode()分别是编译和反编译过程 注意json只接受utf-8编码的字符,所以json_encode()的参数必须是utf-8编码,否则会得到空字符或者nu ...
- 在Mac OS X中使用VIM开发STM32(3)
本文原创于http://www.cnblogs.com/humaoxiao,非法转载者请自重! 在上一篇文章中,我们安装了ctags插件,ctags能对我们的源代码文件中的元素建立索引表, ...
- Qt-获取网络接口信息的综合示例
在前面的文章中介绍了与 获 取 本 机 网 络 信 息 相 关 的 类 常 用 的 有 4 个 , 分 别 是 : QHostAddress, QHostInfo, QNetworkInterface ...
- python使用mysqldb连接数据库操作方法示例详解
这篇文章主要介绍了python mysqldb使用方法,大家参考使用 复制代码代码如下: # -*- coding: utf-8 -*- #mysqldb # site www.jbxue.com ...