SelectByShape 工具的实现

  1  public sealed class SelectByShapeTool : BaseTool
  2     {
  3         #region COM Registration Function(s)
  4         [ComRegisterFunction()]
  5         [ComVisible(false)]
  6         static void RegisterFunction(Type registerType)
  7         {
  8             // Required for ArcGIS Component Category Registrar support
  9             ArcGISCategoryRegistration(registerType);
 10 
 11             //
 12             // TODO: Add any COM registration code here
 13             //
 14         }
 15 
 16         [ComUnregisterFunction()]
 17         [ComVisible(false)]
 18         static void UnregisterFunction(Type registerType)
 19         {
 20             // Required for ArcGIS Component Category Registrar support
 21             ArcGISCategoryUnregistration(registerType);
 22 
 23             //
 24             // TODO: Add any COM unregistration code here
 25             //
 26         }
 27 
 28         #region ArcGIS Component Category Registrar generated code
 29         /// <summary>
 30         /// Required method for ArcGIS Component Category registration -
 31         /// Do not modify the contents of this method with the code editor.
 32         /// </summary>
 33         private static void ArcGISCategoryRegistration(Type registerType)
 34         {
 35             string regKey = string.Format("HKEY_CLASSES_ROOT\\CLSID\\{{{0}}}", registerType.GUID);
 36             ControlsCommands.Register(regKey);
 37 
 38         }
 39         /// <summary>
 40         /// Required method for ArcGIS Component Category unregistration -
 41         /// Do not modify the contents of this method with the code editor.
 42         /// </summary>
 43         private static void ArcGISCategoryUnregistration(Type registerType)
 44         {
 45             string regKey = string.Format("HKEY_CLASSES_ROOT\\CLSID\\{{{0}}}", registerType.GUID);
 46             ControlsCommands.Unregister(regKey);
 47 
 48         }
 49 
 50         #endregion
 51         #endregion
 52 
 53         private IHookHelper m_hookHelper;
 54         private INewEnvelopeFeedback m_Feedback;
 55         private IPoint m_point;
 56         private bool isMouseDown = false;
 57         IMap pMap;
 58 
 59         public SelectByShapeTool()
 60         {
 61             //
 62             // TODO: Define values for the public properties
 63             //
 64             base.m_category = "CustomTool"; //localizable text 
 65             base.m_caption = "拉框选择";  //localizable text 
 66             base.m_message = "拉框选择";  //localizable text
 67             base.m_toolTip = "拉框选择";  //localizable text
 68             base.m_name = "SelectByShape";   //unique id, non-localizable (e.g. "MyCategory_MyTool")
 69             try
 70             {
 71                 //
 72                 // TODO: change resource name if necessary
 73                 //
 74                 string bitmapResourceName = GetType().Name + ".bmp";
 75                 base.m_bitmap = new Bitmap(GetType(), bitmapResourceName);
 76                 base.m_cursor = new System.Windows.Forms.Cursor(GetType(), GetType().Name + ".cur");
 77             }
 78             catch (Exception ex)
 79             {
 80                 System.Diagnostics.Trace.WriteLine(ex.Message, "Invalid Bitmap");
 81             }
 82         }
 83 
 84         #region Overridden Class Methods
 85 
 86         /// <summary>
 87         /// Occurs when this tool is created
 88         /// </summary>
 89         /// <param name="hook">Instance of the application</param>
 90         public override void OnCreate(object hook)
 91         {
 92             if (m_hookHelper == null)
 93                 m_hookHelper = new HookHelperClass();
 94 
 95             m_hookHelper.Hook = hook;
 96             // TODO:  Add SelectByShapeTool.OnCreate implementation
 97         }
 98 
 99         /// <summary>
100         /// Occurs when this tool is clicked
101         /// </summary>
102         public override void OnClick()
103         {
104             // TODO: Add SelectByShapeTool.OnClick implementation
105         }
106 
107         public override void OnMouseDown(int Button, int Shift, int X, int Y)
108         {
109             if (m_hookHelper.ActiveView == null) return;
110             //如果是视图
111             if (m_hookHelper.ActiveView is IActiveView)
112             {
113                 IPoint pPoint = m_hookHelper.ActiveView.ScreenDisplay.
114                     DisplayTransformation.ToMapPoint(X, Y) as IPoint;
115                 pMap = m_hookHelper.ActiveView.HitTestMap(pPoint);
116                 if (pMap != m_hookHelper.FocusMap)
117                 {
118                     m_hookHelper.ActiveView.FocusMap = pMap;
119                     m_hookHelper.ActiveView.PartialRefresh(esriViewDrawPhase.
120                         esriViewGraphics, null, null);
121                 }
122             }
123             //在焦点地图上创建一个点
124             IActiveView pac = m_hookHelper.FocusMap as IActiveView;
125             m_point = pac.ScreenDisplay.DisplayTransformation.ToMapPoint(X, Y) as IPoint;
126             isMouseDown = true;
127         }
128 
129         public override void OnMouseMove(int Button, int Shift, int X, int Y)
130         {
131             if (!isMouseDown) return;
132             //得到焦点图
133             IActiveView pac = m_hookHelper.FocusMap as IActiveView;
134             //初始化一个范围
135             if (m_Feedback == null)
136             {
137                 m_Feedback = new NewEnvelopeFeedbackClass();
138                 m_Feedback.Display = pac.ScreenDisplay;
139                 m_Feedback.Start(m_point);
140             }
141             //设置鼠标样式
142 
143             //画范围
144             m_Feedback.MoveTo(pac.ScreenDisplay.DisplayTransformation.ToMapPoint(X, Y));
145         }
146 
147         public override void OnMouseUp(int Button, int Shift, int X, int Y)
148         {
149             //设置鼠标样式
150 
151             if (!isMouseDown) return;
152             //IEnvelope pEnv;
153             IEnvelope pFeedEnv;
154             IGeometry pGeo;  //查询用到图形,可能为点或者矩形
155             //得到焦点地图
156             IActiveView Pac = m_hookHelper.FocusMap as IActiveView;
157             //如果不画范围
158             if (m_Feedback == null)
159             {
160                 return;
161             }
162             else
163             {
164                 //停止画框
165                 pFeedEnv = m_Feedback.Stop();
166                 pGeo = pFeedEnv as IGeometry;
167             }
168 
169             ISelectionEnvironment pSelectEnv = new SelectionEnvironmentClass();
170             //改变默认选择集的颜色
171             pSelectEnv.DefaultColor = MySymbology.GetRgbColor(110, 120, 210, 200);
172             //选择要素,把它放入选择集中
173             pMap = m_hookHelper.FocusMap;
174             pMap.SelectByShape(pGeo, pSelectEnv, false);
175             Pac.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection, null, null);
176 
177             isMouseDown = false;
178             m_Feedback = null;
179             m_point = null;
180         }
181         #endregion
182     }

参考资料:《ArcGIS  Engine组件式开发及应用》 科学出版社

原文地址:https://www.cnblogs.com/DayDreamEveryWhere/p/2565954.html