《ArcGIS Engine+C#实例开发教程》第七讲 图层符号选择器的实现2
教程目錄:
第一講 桌面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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 每日总结-2016年3月9日
- 下一篇: C#进阶目录