《ArcGIS Engine+C#实例开发教程》第七讲 图层符号选择器的实现2
教程目录: 第一讲 桌面GIS应用程序框架的建立 第二讲 菜单的添加及其实现 第三讲 MapControl与PageLayoutControl同步 第四讲 状态栏信息的添加与实现 第五讲 鹰眼的实现 第六讲 右键菜单添加与实现 教程Bug及优化方案1 第七讲 图层符号选...
- 作者:3SDN.Net来源:3SDN原创|2009年05月12日
教程目录: 第三讲 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.Arc
GIS
.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>
/// <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>
/// <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 事件,以重新设置线符号的线宽和面符号的外框线的线宽。代码如下:
(5) 颜色转换 在 ArcGIS Engine 中,颜色由 IRgbColor 接口实现,而在 .NET 框架中,颜色则由 Color 结构表示。故在调整颜色参数之前,我们必须完成以上两种不同颜色表示方式的转换。关于这两种颜色结构的具体信息,请大家自行查阅相关资料。下面添加两个颜色转换函数。 Arc GIS Engine 中的 IRgbColor 接口转换至 .NET 中的 Color 结构的函数:
///
将
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 接口的函数:
///
将
.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 当然“一个都不能少”。 |