ArcGIS - Engine92+C++实例开发详细教程(8)

2019-04-16 16:55

SymbologyControl的OnStyleClassChanged事件,事件代码与Load事件类似,如下: ///

/// 当样式(Style)改变时,重新设置符号类型和控件的可视性 ///

///

switch ((esriSymbologyStyleClass)(e.symbologyStyleClass)) {

case esriSymbologyStyleClass.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; break;

case esriSymbologyStyleClass.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; break;

case esriSymbologyStyleClass.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; break; } }

2.5 调用自定义符号选择器

通过以上操作,本符号选择器雏形已经完成,我们可以3sdnMap主窗体中调用并进行测试。如果您已经完成“直接调用ArcMap中的符号选择器”这一节,请注释axTOCControl1_OnDoubleClick事件响应函数里的代码,并添加如下代码。如果您是直接学习自定义符号选择器这一节的,请先添加axTOCControl1控件的OnDoubleClick事件,再添加如下事件响应函数代码: ///

/// 双击TOCControl控件时触发的事件 ///

///

private void axTOCControl1_OnDoubleClick(object sender, ITOCControlEvents_OnDoubleClickEvent e) {

esriTOCControlItem itemType = esriTOCControlItem.esriTOCControlItemNone; IBasicMap basicMap = null; ILayer layer = null; object unk = null; object data = null;

axTOCControl1.HitTest(e.x, e.y, ref itemType, ref basicMap, ref layer, ref unk, ref data); if (e.button == 1) {

if(itemType==esriTOCControlItem.esriTOCControlItemLegendClass) { //取得图例

ILegendClass pLegendClass = ((ILegendGroup)unk).get_Class((int)data); //创建符号选择器SymbolSelector实例

SymbolSelectorFrm SymbolSelectorFrm = new SymbolSelectorFrm(pLegendClass, layer); if (SymbolSelectorFrm.ShowDialog() == DialogResult.OK) {

//局部更新主Map控件

m_mapControl.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography,null, null);

//设置新的符号

pLegendClass.Symbol = SymbolSelectorFrm.pSymbol; //更新主Map控件和图层控件

this.axMapControl1.ActiveView.Refresh(); this.axTOCControl1.Refresh(); } } }

按F5编译运行,相信你已经看到自己新手打造的符号选择器已经出现在眼前了。当然,它还比较简陋,下面我们将一起把它做得更完美些。

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

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

2.6 符号参数调整

在地图整饰中,符号参数的调整是必须的功能。下面我们将实现符号颜色、外框颜色、线宽、角度等参数的调整。 (1) 添加SymbologyControl的OnItemSelected事件,此事件在鼠标选中符号时触发,此时显示出选定符号的初始参数,事件响应函数代码如下: ///

/// 选中符号时触发的事件 ///

///

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事件,即在控件的值改变时响应此事件,然后重新设置点符号的大小。代码如下:

///

/// 调整符号大小-点符号 ///

///

private void nudSize_ValueChanged(object sender, EventArgs e) {

((IMarkerSymbol)this.pStyleGalleryItem.Item).Size = (double)this.nudSize.Value; this.PreviewImage(); }

(3) 调整点符号的角度

添加nudAngle控件的ValueChanged事件,以重新设置点符号的角度。代码如下: ///

/// 调整符号角度-点符号 ///

///

private void nudAngle_ValueChanged(object sender, EventArgs e) {

((IMarkerSymbol)this.pStyleGalleryItem.Item).Angle = (double)this.nudAngle.Value; this.PreviewImage();

}

(4) 调整线符号和面符号的线宽

添加nudWidth控件的ValueChanged事件,以重新设置线符号的线宽和面符号的外框线的线宽。代码如下: ///

/// 调整符号宽度-限于线符号和面符号 ///

///

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结构的函数: ///

/// 将ArcGIS Engine中的IRgbColor接口转换至.NET中的Color结构 ///

///

/// .NET中的System.Drawing.Color结构表示ARGB颜色 public Color ConvertIRgbColorToColor(IRgbColor pRgbColor) {

return ColorTranslator.FromOle(pRgbColor.RGB); }

.NET中的Color结构转换至于ArcGIS Engine中的IColor接口的函数:

///

/// 将.NET中的Color结构转换至于ArcGIS Engine中的IColor接口 ///

/// /// IColor

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按钮,添加如下代码: ///

/// 颜色按钮 ///

///

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按钮,添加如下代码: ///

/// 外框颜色按钮 ///

///

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);

= = =


ArcGIS - Engine92+C++实例开发详细教程(8).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:xx基站接入光缆线路单项工程监理规划

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: