日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

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

發(fā)布時間:2024/4/15 C# 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《ArcGIS Engine+C#实例开发教程》第七讲 图层符号选择器的实现2 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
《ArcGIS Engine+C#實例開發(fā)教程》第七講 圖層符號選擇器的實現(xiàn)2 原文:《ArcGIS Engine+C#實例開發(fā)教程》第七講 圖層符號選擇器的實現(xiàn)2

摘要:在第七講 圖層符號選擇器的實現(xiàn)的第一階段中,我們完成了符號選擇器窗體的創(chuàng)建與調(diào)用。在第二階段中,我們繼續(xù)完成符號參數(shù)的調(diào)整與“更多符號”的加載。

教程目錄:

第一講 桌面GIS應用程序框架的建立

第二講 菜單的添加及其實現(xiàn)

第三講 MapControl與PageLayoutControl同步

第四講 狀態(tài)欄信息的添加與實現(xiàn)

第五講 鷹眼的實現(xiàn)

第六講 右鍵菜單添加與實現(xiàn)

教程Bug及優(yōu)化方案1

第七講 圖層符號選擇器的實現(xiàn)1

第七講 圖層符號選擇器的實現(xiàn)2

第八講 屬性數(shù)據(jù)表的查詢顯示

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

《ArcGIS Engine+C#實例開發(fā)教程》為3SDN(http://www.3sdn.net)原創(chuàng)教程,作者閑云野鶴,版權(quán)所有。禁止商業(yè)用途轉(zhuǎn)載(如需請聯(lián)系作者),非商業(yè)用途轉(zhuǎn)載請注明出處并完整保留本聲明。

在第七講 圖層符號選擇器的實現(xiàn)的第一階段中,我們完成了符號選擇器窗體的創(chuàng)建與調(diào)用。在第二階段中,我們繼續(xù)完成符號參數(shù)的調(diào)整與“更多符號”的加載。

2.6???? 符號參數(shù)調(diào)整

在地圖整飾中,符號參數(shù)的調(diào)整是必須的功能。下面我們將實現(xiàn)符號顏色、外框顏色、線寬、角度等參數(shù)的調(diào)整。

(1)?????? 添加SymbologyControl的OnItemSelected事件,此事件在鼠標選中符號時觸發(fā),此時顯示出選定符號的初始參數(shù),事件響應函數(shù)代碼如下:

/// <summary>

/// 選中符號時觸發(fā)的事件

/// </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)?????? 調(diào)整點符號的大小

添加nudSize控件的ValueChanged事件,即在控件的值改變時響應此事件,然后重新設置點符號的大小。代碼如下:

??? /// <summary>

/// 調(diào)整符號大小-點符號

/// </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)?????? 調(diào)整點符號的角度

添加nudAngle控件的ValueChanged事件,以重新設置點符號的角度。代碼如下:

??? /// <summary>

/// 調(diào)整符號角度-點符號

/// </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)?????? 調(diào)整線符號和面符號的線寬

添加nudWidth控件的ValueChanged事件,以重新設置線符號的線寬和面符號的外框線的線寬。代碼如下:

?

/// <summary>

/// 調(diào)整符號寬度-限于線符號和面符號

/// </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)?????? 顏色轉(zhuǎn)換

ArcGIS Engine中,顏色由IRgbColor接口實現(xiàn),而在.NET框架中,顏色則由Color結(jié)構(gòu)表示。故在調(diào)整顏色參數(shù)之前,我們必須完成以上兩種不同顏色表示方式的轉(zhuǎn)換。關于這兩種顏色結(jié)構(gòu)的具體信息,請大家自行查閱相關資料。下面添加兩個顏色轉(zhuǎn)換函數(shù)。

ArcGIS Engine中的IRgbColor接口轉(zhuǎn)換至.NET中的Color結(jié)構(gòu)的函數(shù):

??? /// <summary>

/// 將ArcGIS Engine中的IRgbColor接口轉(zhuǎn)換至.NET中的Color結(jié)構(gòu)

/// </summary>

/// <param name="pRgbColor">IRgbColor</param>

/// <returns>.NET中的System.Drawing.Color結(jié)構(gòu)表示ARGB顏色</returns>

public Color ConvertIRgbColorToColor(IRgbColor pRgbColor)

{

??? return ColorTranslator.FromOle(pRgbColor.RGB);

}

.NET中的Color結(jié)構(gòu)轉(zhuǎn)換至于ArcGIS Engine中的IColor接口的函數(shù):

??? /// <summary>

/// 將.NET中的Color結(jié)構(gòu)轉(zhuǎn)換至于ArcGIS Engine中的IColor接口

/// </summary>

/// <param name="color">.NET中的System.Drawing.Color結(jié)構(gòu)表示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)?????? 調(diào)整所有符號的顏色

選擇顏色時,我們調(diào)用.NET的顏色對話框ColorDialog,選定顏色后,修改顏色按鈕的背景色為選定的顏色,以方便預覽。雙擊btnColor按鈕,添加如下代碼:

/// <summary>

/// 顏色按鈕

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

private void btnColor_Click(object sender, EventArgs e)

{

??? //調(diào)用系統(tǒng)顏色對話框

??? 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)?????? 調(diào)整面符號的外框線顏色

同上一步類似,雙擊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();

??? }

}

?????? 至此,你可以編譯運行程序,看看效果如何,是不是感覺很不錯了?我們已經(jīng)能夠修改符號的參數(shù),自定義符號了。

?????? 但是,SymbologyControl默認加載的是ESRI.ServerStyle文件的樣式,用過ArcMap的你可能已經(jīng)注意到,ArcMap中的Symbol Selector有一個“More Symbols”按鈕,可以加載其它的符號和ServerStyle文件。3sdnMap當然“一個都不能少”。

2.7???? 添加更多符號菜單

還記得我們在開始的時候添加了ContextMenuStrip控件嗎?現(xiàn)在它終于派上用場了。我們要實現(xiàn)的功能是:單擊“更多符號”彈出菜單(ContextMenu),菜單中列出了ArcGIS自帶的其它符號,勾選相應的菜單項就可以在SymbologyControl中增加相應的符號。在菜單的最后一項是“添加符號”,選擇這一項時,將彈出打開文件對話框,我們可以由此選擇其它的ServerStyle文件,以加載更多的符號。

(1)?????? 定義全局變量

SymbolSelectorFrm中定義如下全局變量,用于判斷菜單是否已經(jīng)初始化。

?//菜單是否已經(jīng)初始化標志

?bool contextMenuMoreSymbolInitiated = false;

(2)?????? 雙擊“更多符號”按鈕,添加Click事件。

在此事件響應函數(shù)中,我們要完成ServerStyle文件的讀取,將其文件名作為菜單項名稱生成菜單并顯示菜單。代碼如下:

?

/// <summary>

/// “更多符號”按下時觸發(fā)的事件

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

??????? //取得菜單項數(shù)量

??????? string[] styleNames = System.IO.Directory.GetFiles(path, "*.ServerStyle");

??????? ToolStripMenuItem[] symbolContextMenuItem = new ToolStripMenuItem[styleNames.Length + 1];

??????? //循環(huán)添加其它符號菜單項到菜單

??????? 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???? 編譯運行

相信你已經(jīng)盼這一步很久了吧,按照慣例,按下F5吧!大功造成。

以上代碼在AE9.2+VS2005+XP中編譯通過。

posted on 2016-03-10 12:42 NET未來之路 閱讀(...) 評論(...) 編輯 收藏

轉(zhuǎn)載于:https://www.cnblogs.com/lonelyxmas/p/5261449.html

總結(jié)

以上是生活随笔為你收集整理的《ArcGIS Engine+C#实例开发教程》第七讲 图层符号选择器的实现2的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。