原文:《ArcGIS Engine+C#实例开发教程》第七讲 图层符号选择器的实现2

摘要:在第七讲 图层符号选择器的实现的第一阶段中,我们完成了符号选择器窗体的创建与调用。在第二阶段中,我们继续完成符号参数的调整与“更多符号”的加载。

教程目录:

第一讲 桌面GIS应用程序框架的建立

第二讲 菜单的添加及其实现

第三讲 MapControl与PageLayoutControl同步

第四讲 状态栏信息的添加与实现

第五讲 鹰眼的实现

第六讲 右键菜单添加与实现

教程Bug及优化方案1

第七讲 图层符号选择器的实现1

第七讲 图层符号选择器的实现2

第八讲 属性数据表的查询显示

------------------------------------------------------------------

《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的更多相关文章

  1. 《ArcGIS Engine+C#实例开发教程》第二讲 菜单的添加及其实现

    原文:<ArcGIS Engine+C#实例开发教程>第二讲 菜单的添加及其实现 摘要:在上一讲中,我们实现了应用程序基本框架,其中有个小错误,在此先跟大家说明下.在“属性”选项卡中,我们 ...

  2. 《ArcGIS Engine+C#实例开发教程》第一讲桌面GIS应用程序框架的建立

    原文:<ArcGIS Engine+C#实例开发教程>第一讲桌面GIS应用程序框架的建立 摘要:本讲主要是使用MapControl.PageLayoutControl.ToolbarCon ...

  3. 《ArcGIS Engine+C#实例开发教程》第八讲 属性数据表的查询显示

    原文:<ArcGIS Engine+C#实例开发教程>第八讲 属性数据表的查询显示 第一讲 桌面GIS应用程序框架的建立 第二讲 菜单的添加及其实现 第三讲 MapControl与Page ...

  4. 《ArcGIS Engine+C#实例开发教程》第六讲 右键菜单添加与实现

    原文:<ArcGIS Engine+C#实例开发教程>第六讲 右键菜单添加与实现 摘要:在这一讲中,大家将实现TOCControl控件和主地图控件的右键菜单.在AE开发中,右键菜单有两种实 ...

  5. 《ArcGIS Engine+C#实例开发教程》第四讲 状态栏信息的添加与实现

    原文:<ArcGIS Engine+C#实例开发教程>第四讲 状态栏信息的添加与实现 摘要:在上一讲中,我们完成了 MapControl 和PageLayoutControl两种视图的同步 ...

  6. 《ArcGIS Engine+C#实例开发教程》第五讲 鹰眼的实现

    原文:<ArcGIS Engine+C#实例开发教程>第五讲 鹰眼的实现 摘要:所谓的鹰眼,就是一个缩略地图,上面有一个矩形框,矩形框区域就是当前显示的地图区域,拖动矩形框可以改变当前地图 ...

  7. 《ArcGIS Engine+C#实例开发教程》第三讲 MapControl与PageLayoutControl同步

    原文:<ArcGIS Engine+C#实例开发教程>第三讲 MapControl与PageLayoutControl同步 摘要:在ArcMap中,能够很方面地进行MapView和Layo ...

  8. 《ArcGIS Engine+C#实例开发教程》

    原文:<ArcGIS Engine+C#实例开发教程> 摘要:<ArcGIS Engine+C#实例开发教程>,面向 ArcGIS Engine(以下简称AE)开发初学者,本教 ...

  9. Senparc.Weixin.MP SDK 微信公众平台开发教程(七):解决用户上下文(Session)问题

    从这篇文章中我们已经了解了微信公众平台消息传递的方式,这种方式有一个先天的缺陷:不同用户的请求都来自同一个微信服务器,这使得常规的Session无法使用(始终面对同一个请求对象,况且还有对方服务器Co ...

随机推荐

  1. 通过拆分字段优化SQL

    数据库环境:SQL SERVER 2008R2 今天看到一条用函数处理连接的SQL,是群里某位网友的,SQL语句如下: SELECT SO_Order.fdate , SO_Order.fsn FRO ...

  2. 经历:Java中字符串中按照多个字符拆分或替换:split()和replaceAll()

    一.replaceAll() 今天,遇到了这样的一个字符串[如下代码]: String s="@0|新港@0|天津@0|东莞@0|南沙@0|营口@0|钦州@0|上海@0|汕头@0|连云港@0 ...

  3. invalid code signing entitlement的通用暴力解决办法

    1.添加的一台苹果设备为开发机子后,打版本,说profile 没找到,报错 2.上传二进制文件到itunes connect ,报错 3.有时候还什么 appID 无效,报错 烦死他了 我的解决办法, ...

  4. iOS创建UUID

    - (NSString *)getUUID { CFUUIDRef uuidObj = CFUUIDCreate(nil); //create a new UUID NSString * uuidSt ...

  5. [jquery]高级篇--获取div子元素

    参考: http://zhidao.baidu.com/link?url=IfeQQBn1xMLqWvwdkKbQYJ8mC6ciGi_8M1NYkm6iQ-kXBMX2f2ylN-ckzFLiynn ...

  6. Json字符与Json对象的相互转换

    Json字符与Json对象的相互转换方式有很多,接下来将为大家一一介绍下,感兴趣的朋友可以参考下哈,希望可以帮助到你 1>jQuery插件支持的转换方式: 复制代码 代码如下: $.parseJ ...

  7. 点击穿透问题(http://www.tuicool.com/articles/6NfaUnM)

    一.click与300ms延迟 移动浏览器提供一个特殊的功能:双击(double tap)放大 300ms的延迟就来自这里,用户碰触页面之后,需要等待一段时间来判断是不是双击(double tap)动 ...

  8. iOS中的定时器 - NSTimer 使用方法

    我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3556805.html,享受整齐的排版.有效的链接.正确的代码缩进.更好的阅读体验 ...

  9. java三线程循环有序打印ABC

    迅雷笔试题: 编写一个程序,开启3个线程,这3个线程的ID分别为A.B.C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示:如:ABCABC….依次递推. 解决思路:每个线 ...

  10. 火狐flash插件

    1.解压缩文件: tar -xzvf ***.tar.gz 会解出一个文件:libflashplayer.so 和一个目录 usr 2.将文件libflashplayer.so 拷贝到目录   /us ...