版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、在上一講中,我們完成了 MapControl 和 PageLayoutControl 兩種視圖的同步工作,本講我們將完成狀態(tài)欄信息的添加與實現(xiàn)。 應(yīng)用程序的狀態(tài)欄一般用來顯示程序的當(dāng)前狀態(tài),當(dāng)前所使用的工具。 GIS 應(yīng)用程序一般也在狀態(tài)欄顯示當(dāng)前光標的坐標、比例尺等信息。 學(xué)習(xí)完本講內(nèi)容,您將學(xué)會狀態(tài)欄編程的根本方法,并且能夠在我們的程序的狀態(tài)欄中添加且顯示以下信息: 當(dāng)前所用工具信息 當(dāng)前比例尺 當(dāng)前坐標 1、 添加狀態(tài)欄工程 在設(shè)計視圖中,點擊窗體中的狀態(tài)欄,在其屬性面板中找到“ Items 項,單擊其右邊的按鈕,在下拉框中選擇“ StatusLabel ,單擊“添加按鈕,依次添加四個
2、StatusLabel ,依次修改屬性參數(shù)如下表所示: 序號 Name 屬性 Text 屬性 Spring 屬性 說明 1 MessageLabel 就緒 False 當(dāng)前所用工具信息 2 Blank True 占位 3 ScaleLabel 比例尺 False 當(dāng)前比例尺 4 CoordinateLabel 當(dāng)前坐標 False 當(dāng)前坐標 設(shè)置好之后如下列圖所示: Tips : 我們設(shè)計出的狀態(tài)欄最終如下所示: 就緒 Blank 比例尺 當(dāng)前坐標 Spring 屬性表示可以按狀態(tài)欄剩余空間自動伸縮。所以參加 Blank 工程,只是為了占個位子,以到達 ScaleLabel 和 Coordin
3、ateLabel 工程右對齊而 MessageLabel 工程左對齊的目的。 2、 顯示當(dāng)前所用工具信息 首先添加 axToolbarControl1 的 OnMouseMove 事件 ( 相信大家看了以上的教程,已經(jīng)知道怎么添加事件了吧,還不知道的建議再溫習(xí)下前幾講的內(nèi)容 ) 。在其事件響應(yīng)函數(shù)代碼如下: private void axToolbarControl1_OnMouseMove(object sender, IToolbarControlEvents_OnMouseMoveEvent e) / 取得鼠標所在工具的索引號 int index = axToolbarControl1.
4、HitTest(e.x, e.y, false); if (index != -1) / 取得鼠標所在工具的 ToolbarItem IToolbarItem toolbarItem = axToolbarControl1.GetItem(index); / 設(shè)置狀態(tài)欄信息 MessageLabel.Text = toolbarItem mand.Message; else MessageLabel.Text = 就緒 ; 3、 顯示當(dāng)前比例尺 添加 axMapControl1 的 OnMouseMove 事件,其代碼如下: private void axMapControl1_OnMouse
5、Move(object sender, IMapControlEvents2_OnMouseMoveEvent e) / 顯示當(dāng)前比例尺 ScaleLabel.Text = 比例尺 1: + (long)this.axMapControl1.MapScale).ToString(); 4、 顯示當(dāng)前坐標 顯示當(dāng)前坐標也是 axMapControl1 的 OnMouseMove 事件中響應(yīng),故只要在 axMapControl1_OnMouseMove 函數(shù)中添加如下代碼即可: / 顯示當(dāng)前坐標 CoordinateLabel.Text = 當(dāng)前坐標 X = + e.mapX.ToString()
6、 + Y = + e.mapY.ToString() + + this.axMapControl1.MapUnits; 按 F5 編譯運行,可以看到,我們的程序已經(jīng)能夠正常工作了。但是細心的你可能會發(fā)現(xiàn),當(dāng)前坐標的后面的坐標單位為“ esriUnknownUnits 或“ esriMeters 之類,即系統(tǒng)在正常單位的前面加上了“ esri ,追求完美的我們自然看得不舒服。那就進行簡單的替換吧。 首先定義個全局坐標單位變量 sMapUnits ,如下所示: private string sMapUnits; 再 Form1_Load 函數(shù)中進行初始化: sMapUnits = Unknown;
7、 添加 axMapControl1 控件的 OnMapReplaced 事件,在事件響應(yīng)函數(shù)中進行坐標單位替換,代碼如下: private void axMapControl1_OnMapReplaced(object sender, IMapControlEvents2_OnMapReplacedEvent e) esriUnits mapUnits = axMapControl1.MapUnits; switch (mapUnits) case esriUnits.esriCentimeters: sMapUnits = Centimeters; break; case esriUnits
8、.esriDecimalDegrees: sMapUnits = Decimal Degrees; break; case esriUnits.esriDecimeters: sMapUnits = Decimeters; break; case esriUnits.esriFeet: sMapUnits = Feet; break; case esriUnits.esriInches: sMapUnits = Inches; break; case esriUnits.esriKilometers: sMapUnits = Kilometers; break; case esriUnits.
9、esriMeters: sMapUnits = Meters; break; case esriUnits.esriMiles: sMapUnits = Miles; break; case esriUnits.esriMillimeters: sMapUnits = Millimeters; break; case esriUnits.esriNauticalMiles: sMapUnits = NauticalMiles; break; case esriUnits.esriPoints: sMapUnits = Points; break; case esriUnits.esriUnkn
10、ownUnits: sMapUnits = Unknown; break; case esriUnits.esriYards: sMapUnits = Yards; break; 5、 編譯運行 按 F5 編譯運行程序。如果你足夠細心的話,相信你已經(jīng)成功了! 在本講中,介紹中 StatusStrip 控件的根本使用方法和 AE 中當(dāng)所用工具信息、當(dāng)前比例尺和當(dāng)前坐標的顯示調(diào)用方法。 在上一講中,我們實現(xiàn)了狀態(tài)欄的相關(guān)信息顯示,在這一講中我們將要實現(xiàn)鷹眼功能。 所謂的鷹眼,就是一個縮略地圖,上面有一個矩形框,矩形框區(qū)域就是當(dāng)前顯示的地圖區(qū)域,拖動矩形框可以改變當(dāng)前地圖顯示的位置,改變矩形框的大小
11、,可以改變當(dāng)前地圖的顯示區(qū)域大小,從起到導(dǎo)航的作用。鷹眼是地圖瀏覽中常用的功能之一。 關(guān)于鷹眼的實現(xiàn)方式,最常用的是用一個 MapControl 控件顯示地圖全圖,并在上面畫一個紅色矩形框表示當(dāng)前地圖的顯示范圍,并實現(xiàn)鷹眼 MapControl 與主窗體的 MapControl 互動。本講最終效果如下所示: 圖 1 鷹眼效果 1 、添加鷹眼控件 由于本教程在第一講中沒有預(yù)先考慮到鷹眼所放的位置,故我們要先稍微調(diào)整一下程序框架,并添加一個 MapControl 用于顯示鷹眼。 在本教程中,我們將鷹眼放在圖層控件的下方,調(diào)整方法如下: 1 在設(shè)計視圖中,選擇 tabControl1 控件,即放圖層
12、和屬性的那個容器,將其 Dock 屬性設(shè)為 None ,并用鼠標拖拽將其縮小。把工具箱中的 SplitContainer 控件拖到窗體的左窗格,即放在 tabControl1 控件的旁邊。并將其 Orientation 屬性設(shè)置為 Horizontal 。 2 選中 tabControl1 控件,按 Ctrl+X 剪切,再選中剛剛粘貼到 SplitContainer2 的 Panel1 中,如圖 2 所示。操作完成后效果如圖 3 所示。 圖 2 圖 3 3 再選中 SplitContainer2 控件如果不好選中,直接以屬性面板中選擇 SplitContainer2 ,將其 Dock 屬性設(shè)置
13、為 Fill 。再選中 tabControl1 ,將其 Dock 屬性也設(shè)置為 Fill 。 4 從工具箱中選擇 MapControl 控件并拖到 SplitContainer2 的 Panel2 ,作為鷹眼控件。最終效果如圖 4 所示。 圖 4 2 、鷹眼的實現(xiàn) 1 載入地圖到鷹眼控件 當(dāng)?shù)貓D載入到主 Map 控件時,同時也載入到鷹眼控件,在 axMapControl1_OnMapReplaced 事件響應(yīng)函數(shù)此函數(shù)上一講中已經(jīng)添加了中添加如下代碼: private void axMapControl1_OnMapReplaced(object sender, IMapControlEven
14、ts2_OnMapReplacedEvent e) / 前面代碼省略 / 當(dāng)主地圖顯示控件的地圖更換時,鷹眼中的地圖也跟隨更換 this.axMapControl2.Map = new MapClass(); / 添加主地圖控件中的所有圖層到鷹眼控件中 for (int i = 1; i = this.axMapControl1.LayerCount; i+) this.axMapControl2.AddLayer(this.axMapControl1.get_Layer(this.axMapControl1.LayerCount - i); / 設(shè)置 MapControl 顯示范圍至數(shù)據(jù)的全
15、局范圍 this.axMapControl2.Extent = this.axMapControl1.FullExtent; / 刷新鷹眼控件地圖 this.axMapControl2.Refresh(); 2 繪制鷹眼矩形框 為鷹眼控件 MapControl1 添加 OnExtentUpdated 事件,此事件是在主 Map 控件的顯示范圍改變時響應(yīng),從而相應(yīng)更新鷹眼控件中的矩形框。其響應(yīng)函數(shù)代碼如下: private void axMapControl1_OnExtentUpdated(object sender, IMapControlEvents2_OnExtentUpdatedEve
16、nt e) / 得到新范圍 IEnvelope pEnv = (IEnvelope)e.newEnvelope; IGraphicsContainer pGra = axMapControl2.Map as IGraphicsContainer; IActiveView pAv = pGra as IActiveView; / 在繪制前,去除 axMapControl2 中的任何圖形元素 pGra.DeleteAllElements(); IRectangleElement pRectangleEle = new RectangleElementClass(); IElement pEle =
17、 pRectangleEle as IElement; pEle.Geometry = pEnv; / 設(shè)置鷹眼圖中的紅線框 IRgbColor pColor = new RgbColorClass(); pColor.Red = 255; pColor.Green = 0; pColor.Blue = 0; pColor.Transparency = 255; / 產(chǎn)生一個線符號對象 ILineSymbol pOutline = new SimpleLineSymbolClass(); pOutline.Width = 2; pOutline.Color = pColor; / 設(shè)置顏色屬性
18、 pColor = new RgbColorClass(); pColor.Red = 255; pColor.Green = 0; pColor.Blue = 0; pColor.Transparency = 0; / 設(shè)置填充符號的屬性 IFillSymbol pFillSymbol = new SimpleFillSymbolClass(); pFillSymbol.Color = pColor; pFillSymbol.Outline = pOutline; IFillShapeElement pFillShapeEle = pEle as IFillShapeElement; pFi
19、llShapeEle.Symbol = pFillSymbol; pGra.AddElement(IElement)pFillShapeEle, 0); / 刷新 pAv.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null); 3 鷹眼與主 Map 控件互動 為鷹眼控件 MapControl2 添加 OnMouseDown 事件,代碼如下: private void axMapControl2_OnMouseDown(object sender, IMapControlEvents2_OnMouseDownEvent e)
20、 if (this.axMapControl2.Map.LayerCount != 0) / 按下鼠標左鍵移動矩形框 if (e.button = 1) IPoint pPoint = new PointClass(); pPoint.PutCoords(e.mapX, e.mapY); IEnvelope pEnvelope = this.axMapControl1.Extent; pEnvelope.CenterAt(pPoint); this.axMapControl1.Extent = pEnvelope; this.axMapControl1.ActiveView.PartialRe
21、fresh(esriViewDrawPhase.esriViewGeography, null, null); / 按下鼠標右鍵繪制矩形框 else if (e.button = 2) IEnvelope pEnvelop = this.axMapControl2.TrackRectangle(); this.axMapControl1.Extent = pEnvelop; this.axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, null, null); 為鷹眼控件 MapControl
22、2 添加 OnMouseMove 事件,主要實現(xiàn)按下鼠標左鍵的時候移動矩形框,同時也改變主的圖控件的顯示范圍。代碼如下: private void axMapControl2_OnMouseMove(object sender, IMapControlEvents2_OnMouseMoveEvent e) / 如果不是左鍵按下就直接返回 if (e.button != 1) return; IPoint pPoint = new PointClass(); pPoint.PutCoords(e.mapX, e.mapY); this.axMapControl1.CenterAt(pPoint)
23、; this.axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, null, null); 1、 編譯運行 按 F5 編譯運行程序。 期待的鷹眼功能你已經(jīng)實現(xiàn)了,按下左鍵在鷹眼窗口中移動,或者按下右鍵在鷹眼窗口中畫一個矩形,主地圖窗口的顯示范圍都會跟著變化。主地圖窗口中的地圖經(jīng)放大縮小等操作后,鷹眼窗口的矩形框大小也會隨著改變。 在上一講中,我們完成了鷹眼功能,在這一講中,大家將實現(xiàn)TOCControl控件和主地圖控件的右鍵菜單。在AE開發(fā)中,右鍵菜單有兩種實現(xiàn)方式,一是使用VS2005自帶的
24、ContextMenuStrip控件,二是用AE封裝的IToolbarMenu接口。相比擬而言,后者更為簡單實用,本文采用后者的實現(xiàn)方法。1、創(chuàng)立右鍵菜單在Form1類里面添加如下變量的定義:/TOCControl控件變量 private ITOCControl2 m_tocControl = null;/TOCControl中Map菜單private IToolbarMenu m_menuMap = null;/TOCControl中圖層菜單private IToolbarMenu m_menuLayer = null;在Form1_Load函數(shù)進行初始化,即菜單的創(chuàng)立:m_menuMap
25、= new ToolbarMenuClass();m_menuLayer = new ToolbarMenuClass();2、添加菜單項第1步中創(chuàng)立的菜單可認為是菜單容器,里面什么都沒有,具體的命令或工具作為菜單項添加到菜單容器才能工作。一般情況下,啟動程序就要完成菜單項的添加,故此工作在Form1_Load函數(shù)完成。當(dāng)然,添加菜單項之前,必須實現(xiàn)相應(yīng)命令或工具。這里的命令或工具可以AE內(nèi)置的也可以是自定義的。AE內(nèi)置了許多可以直接調(diào)用的常用命令和工具,如ControlsAddDataCommandClass,在ESRI.ArcGIS.Controls命名空間中,大家可以對象瀏覽器中查看。當(dāng)
26、然,這里也可以直接調(diào)用AE內(nèi)置的菜單,如ControlsFeatureSelectionMenu。另外,本講也實現(xiàn)三自定義命令,以做示范。它們分別為圖層可視控制命令用于控制圖層顯示與否、移除圖層和放大到整個圖層命令。實現(xiàn)方法也很簡單,就是右擊3sdnMap工程,選擇“添加|類,選擇C#普通的類模板,用以下代碼覆蓋系統(tǒng)自己生成的所有代碼。圖層可視控制類LayerVisibility代碼:using ESRI.ArcGIS.ADF.BaseClasses; using ESRI.ArcGIS.Controls;using ESRI.ArcGIS.Carto;using ESRI.ArcGIS.Sy
27、stemUI;namespace _sdnMap/ / 圖層可視控制/ public sealed class LayerVisibility : BaseCommand, ICommandSubType private IHookHelper m_hookHelper = new HookHelperClass();private long m_subType;public LayerVisibility()public override void OnClick()for (int i=0; i = m_hookHelper.FocusMap.LayerCount - 1; i+)if (
28、m_subType = 1) m_hookHelper.FocusMap.get_Layer(i).Visible = true;if (m_subType = 2) m_hookHelper.FocusMap.get_Layer(i).Visible = false;m_hookHelper.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography,null,null);public override void OnCreate(object hook)m_hookHelper.Hook = hook;public int G
29、etCount()return 2;public void SetSubType(int SubType)m_subType = SubType;public override string Captiongetif (m_subType = 1) return Turn All Layers On;else return Turn All Layers Off;public override bool Enabledgetbool enabled = false; int i;if (m_subType = 1) for (i=0;i=m_hookHelper.FocusMap.LayerC
30、ount - 1;i+)if (m_hookHelper.ActiveView.FocusMap.get_Layer(i).Visible = false)enabled = true;break;else for (i=0;i=m_hookHelper.FocusMap.LayerCount - 1;i+)if (m_hookHelper.ActiveView.FocusMap.get_Layer(i).Visible = true)enabled = true;break;return enabled; 移除圖層類RemoveLayer代碼:using ESRI.ArcGIS.ADF.Ba
31、seClasses; using ESRI.ArcGIS.Carto;using ESRI.ArcGIS.Controls;namespace _sdnMap/ / 刪除圖層/ public sealed class RemoveLayer : BaseCommandprivate IMapControl3 m_mapControl;public RemoveLayer()base.m_caption = Remove Layer;public override void OnClick()ILayer layer = (ILayer)m_mapControl.CustomProperty;m
32、_mapControl.Map.DeleteLayer(layer);public override void OnCreate(object hook)m_mapControl = (IMapControl3)hook; 放大至整個圖層類ZoomToLayer:using ESRI.ArcGIS.ADF.BaseClasses; using ESRI.ArcGIS.Carto;using ESRI.ArcGIS.Controls;namespace _sdnMap/ / 放大至整個圖層/ public sealed class ZoomToLayer : BaseCommandprivate
33、 IMapControl3 m_mapControl;public ZoomToLayer()base.m_caption = Zoom To Layer;public override void OnClick()ILayer layer = (ILayer)m_mapControl.CustomProperty;m_mapControl.Extent = layer.AreaOfInterest;public override void OnCreate(object hook)m_mapControl = (IMapControl3)hook;以上三個工具或命令的實現(xiàn)代碼比擬簡單,在此不
34、過多的分析,請讀者自行理解。下面在Form1_Load函數(shù)中進行菜單項的添加,代碼如下:/添加自定義菜單項到TOCCOntrol的Map菜單中 /翻開文檔菜單m_menuMap.AddItem(new OpenNewMapDocument(m_controlsSynchronizer), -1, 0, false, esriCommandStyles.esriCommandStyleIconAndText);/添加數(shù)據(jù)菜單m_menuMap.AddItem(new ControlsAddDataCommandClass(), -1, 1, false, esriCommandStyles.es
35、riCommandStyleIconAndText);/翻開全部圖層菜單m_menuMap.AddItem(new LayerVisibility(), 1, 2, false, esriCommandStyles.esriCommandStyleTextOnly);/關(guān)閉全部圖層菜單m_menuMap.AddItem(new LayerVisibility(), 2, 3, false, esriCommandStyles.esriCommandStyleTextOnly);/以二級菜單的形式添加內(nèi)置的“選擇菜單m_menuMap.AddSubMenu(esriControls.Contro
36、lsFeatureSelectionMenu, 4, true);/以二級菜單的形式添加內(nèi)置的“地圖瀏覽菜單m_menuMap.AddSubMenu(esriControls.ControlsMapViewMenu,5, true);/添加自定義菜單項到TOCCOntrol的圖層菜單中m_menuLayer = new ToolbarMenuClass();/添加“移除圖層菜單項m_menuLayer.AddItem(new RemoveLayer(), -1, 0, false, esriCommandStyles.esriCommandStyleTextOnly);/添加“放大到整個圖層菜
37、單項m_menuLayer.AddItem(new ZoomToLayer(), -1, 1, true, esriCommandStyles.esriCommandStyleTextOnly);/設(shè)置菜單的Hookm_menuLayer.SetHook(m_mapControl);m_menuMap.SetHook(m_mapControl);3、彈出右鍵菜單顧名思義,右鍵菜單是在鼠標右鍵按下的時候彈出,所以我們要添加TOCControl1控件的OnMouseDown事件,實現(xiàn)代碼如下:private void axTOCControl1_OnMouseDown(object sender,
38、 ITOCControlEvents_OnMouseDownEvent e) /如果不是右鍵按下直接返回if (e.button != 2) return;esriTOCControlItem item = esriTOCControlItem.esriTOCControlItemNone;IBasicMap map = null; ILayer layer = null;object other = null; object index = null;/判斷所選菜單的類型m_tocControl.HitTest(e.x, e.y, ref item, ref map, ref layer,
39、ref other, ref index);/確定選定的菜單類型,Map或是圖層菜單if (item = esriTOCControlItem.esriTOCControlItemMap)m_tocControl.SelectItem(map, null);elsem_tocControl.SelectItem(layer, null);/設(shè)置CustomProperty為layer (用于自定義的Layer命令)m_mapControl.CustomProperty = layer;/彈出右鍵菜單if (item = esriTOCControlItem.esriTOCControlItem
40、Map) m_menuMap.PopupMenu(e.x, e.y, m_tocControl.hWnd);if (item = esriTOCControlItem.esriTOCControlItemLayer) m_menuLayer.PopupMenu(e.x, e.y, m_tocControl.hWnd);同樣的方法,我們也可以實現(xiàn)主地圖控件的右鍵菜單,以方便地圖瀏覽。添加MapControl1控件的OnMouseDown事件,實現(xiàn)代碼如下:/ / 主地圖控件的右鍵響應(yīng)函數(shù)/ / / private void axMapControl1_OnMouseDown(object sen
41、der, IMapControlEvents2_OnMouseDownEvent e)if (e.button = 2)/彈出右鍵菜單m_menuMap.PopupMenu(e.x,e.y,m_mapControl.hWnd);4、編譯運行按F5編譯運行程序,你會發(fā)現(xiàn),原來右鍵菜單實現(xiàn)起來是這么的簡單??!到第六講為止已經(jīng)發(fā)現(xiàn)的教程Bug及解決方法如下:1、在第二講可能會出現(xiàn)變量未定義。原因:第二講與第三講聯(lián)系緊密,我為控制篇幅才將其分為兩講,某些變量是在第三講才進行定義,請大家注意。2、第六講彈不出TOCControl的右鍵菜單原因:沒有取得m_tocControl的指針,即沒有把m_tocC
42、ontrol指針與axTOCControl1控件綁定,導(dǎo)致調(diào)用m_menuMap.PopupMenu(e.x, e.y, m_tocControl.hWnd);時m_tocControl.hWnd為NULL,故無法彈出菜單。解決方法:在Form1_Load()函數(shù)中,添加如下代碼:m_tocControl = (ITOCControl2)this.axTOCControl1.Object; 目前已經(jīng)發(fā)現(xiàn)的優(yōu)化方案如下:1、教程第四講,坐標單位前面的esri,原用switch語句逐一替換,其實直接用取子串(Substring)的方法截去更方便。修改代碼如下:CoordinateLabel.Tex
43、t = 當(dāng)前坐標 X = + e.mapX.ToString() + Y = + e.mapY.ToString() + + this.axMapControl1.MapUnits.ToString().Substring(4);2、教程第四講,固定狀態(tài)欄中的比例尺和當(dāng)前坐標工程的寬度以防止閃爍。方法如下:選中狀態(tài)欄中的比例尺或當(dāng)前坐標工程,把其autoSize屬性設(shè)為False,再在Size屬性里設(shè)置寬度。經(jīng)測試,比例尺寬度為150,當(dāng)前坐標寬度為400比擬適宜。在上一講中,我們實現(xiàn)了右鍵菜單ContextMenu的添加與實現(xiàn),在最后我預(yù)留給下一講的問題是TOCControl控件圖層拖拽的實
44、現(xiàn)。后來發(fā)現(xiàn)此功能的實現(xiàn)異常簡單,只要在TOCControl的屬性頁中,勾選“Enable Layer Drag and Drop即可。這一講,我們要實現(xiàn)的是圖層符號選擇器,與ArcMap中的Symbol Selector的類似。本講較前幾講而言,些許有些復(fù)雜,不過只要仔細琢磨,認真操作,你就很容易實現(xiàn)如下所示的符號選擇器。因為本講篇幅較長,故我將其分成兩個階段,本文是第一階段。圖1 在AE開發(fā)中,符號選擇器有兩種實現(xiàn)方式。一是在程序中直接調(diào)用ArcMap中的符號選擇器,如下所示:圖2二是自定義符號選擇器,如圖1所示。由于第一種方式前提是必須安裝ArcGIS Desktop,其界面還是英文的,
45、而對二次開發(fā)來說,大局部用戶希望應(yīng)該是中文界面。因此開發(fā)人員通常選擇第二種方式,本講也著重講解第二種方式。通過對?ArcGIS Engine+C#實例開發(fā)教程?前六講的學(xué)習(xí),我已經(jīng)假定你已經(jīng)根本熟悉C#語言和VS2005的操作,故在下面的教程中,我不準備說明每一步驟的具體操作方法,而只是說明操作步驟,以節(jié)省時間和篇幅。1. 直接調(diào)用ArcMap中的符號選擇器1添加ESRI.ArcGIS.DisplayUI的引用。分別在解決方案管理器和代碼中添加引用。2添加TOCControl的Double_Click事件。3實現(xiàn)TOCControl的Double_Click事件。因為種方法不是本講的重點,故不
46、對代碼進行分析,有興趣的讀者請自行理解或結(jié)合后面的內(nèi)容理解。代碼如下:private void axTOCControl1_OnDoubleClick(object sender, ITOCControlEvents_OnDoubleClickEvent e) esriTOCControlItem toccItem = esriTOCControlItem.esriTOCControlItemNone;ILayer iLayer = null;IBasicMap iBasicMap = null;object unk = null;object data = null;if (e.button
47、 = 1)axTOCControl1.HitTest(e.x, e.y, ref toccItem, ref iBasicMap, ref iLayer, ref unk,ref data);System.Drawing.Point pos = new System.Drawing.Point(e.x, e.y);if (toccItem = esriTOCControlItem.esriTOCControlItemLegendClass)ESRI.ArcGIS.Carto.ILegendClass pLC = new LegendClassClass();ESRI.ArcGIS.Carto.
48、ILegendGroup pLG = new LegendGroupClass();if (unk is ILegendGroup)pLG = (ILegendGroup)unk;pLC = pLG.get_Class(int)data);ISymbol pSym;pSym = pLC.Symbol;ESRI.ArcGIS.DisplayUI.ISymbolSelector pSS = newESRI.ArcGIS.DisplayUI.SymbolSelectorClass();bool bOK = false;pSS.AddSymbol(pSym);bOK = pSS.SelectSymbo
49、l(0);if (bOK)pLC.Symbol = pSS.GetSymbolAt(0);this.axMapControl1.ActiveView.Refresh();this.axTOCControl1.Refresh();4編譯運行即可。2. 自定義符號選擇器AE9.2提供了SymbologyControl控件,極大的方便了圖層符號選擇器的制作。本講實現(xiàn)的符號選擇器有如下功能。用戶雙擊TOCControl控件中圖層的符號時,彈出選擇符號對話框,對話框能夠根據(jù)圖層類型自動加載相應(yīng)的符號,如點、線、面。用戶可以調(diào)整符號的顏色、線寬、角度等參數(shù)。還可以翻開自定義的符號文件*.ServerSty
50、le,加載更多的符號。2.1 新建符號選擇器窗體新建Winodws窗體,命名為SymbolSelectorFrm,修改窗體的Text屬性為“選擇符號。并添加SymboloryControl、PictureBox、Button、Label、NumericUpDown、GroupBox、ColorDialog、OpenFileDialog、ContextMenuStrip控件。控件布局如下所示:圖32.2 設(shè)置控件屬性設(shè)置相應(yīng)控件的相關(guān)屬性,如下表所示(空那么不用修改):控件Name屬性Text屬性其它SymbologyControlaxSymbologyControlPictureBoxptbP
51、reviewLabellblColor顏色LabellblSize大小LabellblWidth線寬LabellblAngle角度LabellblOutlineColor外框顏色NumericUpDownnudSizeNumericUpDownnudWidthNumericUpDownnudAngleButtonbtnColor設(shè)置為空ButtonbtnOutlineColor設(shè)置為空ButtonbtnMoreSymbols更多符號ButtonbtnOK確定DialogResult屬性設(shè)為OKButtonbtnCancel取消GroupBoxgroupBox1預(yù)覽GroupBoxgroupBo
52、x2設(shè)置ColorDialogcolorDialogOpenFileDialogopenFileDialogFilter屬性設(shè)置為:Styles 文件|*.ServerStyleContextMenuStripcontextMenuStripMoreSymbol2.3 添加引用在解決方案資源管理器中添加ArcGIS Engine的ESRI.ArcGIS.Geodatabase引用,在SymbolSelectorFrm.cs文件中添加如下引用代碼:using ESRI.ArcGIS.Carto; using ESRI.ArcGIS.Display;using ESRI.ArcGIS.esriSy
53、stem;using ESRI.ArcGIS.SystemUI;using ESRI.ArcGIS.Controls;using ESRI.ArcGIS.Geodatabase;2.4 初始化1 添加SymbolSelectorFrm的全局變量,代碼如下:private IStyleGalleryItem pStyleGalleryItem;private ILegendClass pLegendClass;private ILayer pLayer;public ISymbol pSymbol;public Image pSymbolImage;2 修改SymbolSelectorFrm的構(gòu)
54、造函數(shù),傳入圖層和圖例接口。代碼如下:/ / 構(gòu)造函數(shù),初始化全局變量/ / TOC圖例/ 圖層public SymbolSelectorFrm(ILegendClass tempLegendClass, ILayer tempLayer)InitializeComponent();this.pLegendClass = tempLegendClass;this.pLayer = tempLayer;3 添加SymbolControl的SymbologyStyleClass設(shè)置函數(shù)SetFeatureClassStyle(),代碼如下:/ / 初始化SymbologyControl的Style
55、Class,圖層如果已有符號,那么把符號添加到SymbologyControl中的第一個符號,并選中/ / private void SetFeatureClassStyle(esriSymbologyStyleClass symbologyStyleClass)this.axSymbologyControl.StyleClass = symbologyStyleClass;ISymbologyStyleClass pSymbologyStyleClass = this.axSymbologyControl.GetStyleClass(symbologyStyleClass);if (this
56、.pLegendClass != null)IStyleGalleryItem currentStyleGalleryItem = new ServerStyleGalleryItem();currentStyleGalleryItem.Name = 當(dāng)前符號;currentStyleGalleryItem.Item = pLegendClass.Symbol;pSymbologyStyleClass.AddItem(currentStyleGalleryItem,0);this.pStyleGalleryItem = currentStyleGalleryItem;pSymbologySty
57、leClass.SelectItem(0);4 添加注冊表讀取函數(shù)ReadRegistry(),此函數(shù)從注冊表中讀取ArcGIS的安裝路徑,代碼如下:/ / 從注冊表中取得指定軟件的路徑/ / / private string ReadRegistry(string sKey)/Open the subkey for readingMicrosoft.Win32.RegistryKey rk = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(sKey, true);if (rk = null) return ;/ Get the data f
58、rom a specified item in the key.return (string)rk.GetValue(InstallDir);5 添加SymbolSelectorFrm的Load事件。根據(jù)圖層類型為SymbologyControl導(dǎo)入相應(yīng)的符號樣式文件,如點、線、面,并設(shè)置控件的可視性。代碼如下:private void SymbolSelectorFrm_Load(object sender, EventArgs e)/取得ArcGIS安裝路徑string sInstall = ReadRegistry(SOFTWAREESRICoreRuntime);/載入ESRI.Ser
59、verStyle文件到SymbologyControlthis.axSymbologyControl.LoadStyleFile(sInstall + StylesESRI.ServerStyle);/確定圖層的類型(點線面),設(shè)置好SymbologyControl的StyleClass,設(shè)置好各控件的可見性(visible)IGeoFeatureLayer pGeoFeatureLayer = (IGeoFeatureLayer)pLayer;switch (IFeatureLayer)pLayer).FeatureClass.ShapeType)case ESRI.ArcGIS.Geome
60、try.esriGeometryType.esriGeometryPoint:this.SetFeatureClassStyle(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.lbl
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 個人房產(chǎn)買賣標準協(xié)議樣本(2024年版)版B版
- 個人債權(quán)轉(zhuǎn)讓協(xié)議(2024版)3篇
- 個人手車買賣合同
- 專業(yè)軟件技術(shù)開發(fā)服務(wù)協(xié)議(2024年更新版)版B版
- 二零二四商場LED顯示屏采購與安裝合同
- 2025年度城市綜合體配套廠房建造與裝修承包合同范本4篇
- 2025年度廠房土地開發(fā)及使用權(quán)出讓合同4篇
- 2025年度插座產(chǎn)品售后服務(wù)網(wǎng)絡(luò)建設(shè)合同4篇
- 2025年度科技園區(qū)場地轉(zhuǎn)租及知識產(chǎn)權(quán)保護協(xié)議4篇
- 2024年05月上海華夏銀行上海分行招考筆試歷年參考題庫附帶答案詳解
- 春節(jié)行車安全常識普及
- 電機維護保養(yǎng)專題培訓(xùn)課件
- 汽車租賃行業(yè)利潤分析
- 春節(jié)拜年的由來習(xí)俗來歷故事
- 2021火災(zāi)高危單位消防安全評估導(dǎo)則
- 佛山市服務(wù)業(yè)發(fā)展五年規(guī)劃(2021-2025年)
- 房屋拆除工程監(jiān)理規(guī)劃
- 醫(yī)院保安服務(wù)方案(技術(shù)方案)
- 高效能人士的七個習(xí)慣:實踐應(yīng)用課程:高級版
- 小數(shù)加減法計算題100道
- 通信電子線路(哈爾濱工程大學(xué))智慧樹知到課后章節(jié)答案2023年下哈爾濱工程大學(xué)
評論
0/150
提交評論