注意要将捕捉相关接口的对象放在OnCreate方法中,这样在初始化就可以有捕捉效果,(捕捉对象赋值放在OnClick中出现第一次点击之前不能捕捉的BUG)
这里是直接在工具中实现的 ,可以按需求将捕捉效果的实现方式进行改写。
using System; using System.Drawing; using System.Runtime.InteropServices; using ESRI.ArcGIS.ADF.BaseClasses; using ESRI.ArcGIS.ADF.CATIDs; using ESRI.ArcGIS.Controls; using System.Windows.Forms; using ESRI.ArcGIS.Geometry; using ESRI.ArcGIS.Display; using ESRI.ArcGIS.esriSystem; namespace DemoForm.Tools { public sealed class SnapTool : BaseTool { private IHookHelper m_hookHelper = null; private IPoint m_snapPt; private ISnappingEnvironment m_SnapEnv; private IPointSnapper m_Snapper; private ISnappingFeedback m_SnapFeedback; private INewLineFeedback m_feedback; private ISnappingResult m_snapRst; public SnapTool() { // // TODO: Define values for the public properties // base.m_category = ""; //localizable text base.m_caption = ""; //localizable text base.m_message = "This should work in ArcMap/MapControl/PageLayoutControl"; //localizable text base.m_toolTip = ""; //localizable text base.m_name = ""; //unique id, non-localizable (e.g. "MyCategory_MyTool") try { // // TODO: change resource name if necessary // string bitmapResourceName = GetType().Name + ".bmp"; base.m_bitmap = new Bitmap(GetType(), bitmapResourceName); base.m_cursor = new System.Windows.Forms.Cursor(GetType(), GetType().Name + ".cur"); } catch (Exception ex) { System.Diagnostics.Trace.WriteLine(ex.Message, "Invalid Bitmap"); } } #region Overridden Class Methods public override void OnCreate(object hook) { try { m_hookHelper = new HookHelperClass(); m_hookHelper.Hook = hook; if (m_hookHelper.ActiveView == null) { m_hookHelper = null; } } catch { m_hookHelper = null; } if (m_hookHelper == null) base.m_enabled = false; else base.m_enabled = true; // TODO: Add other initialization code UID uid = new UIDClass(); uid.Value = "{E07B4C52-C894-4558-B804-D4050018D1DA}"; IExtensionManager extMar = (m_hookHelper as IHookHelper2).ExtensionManager; IExtension ext=extMar.FindExtension(uid); m_SnapEnv = ext as ISnappingEnvironment; m_Snapper = m_SnapEnv.PointSnapper; m_SnapFeedback = new SnappingFeedbackClass(); m_SnapFeedback.Initialize(m_hookHelper.Hook, m_SnapEnv, true); } public override void OnClick() { // } public override void OnMouseDown(int Button, int Shift, int X, int Y) { IPoint ppt = m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(X, Y); if (m_snapPt != null) { ppt = m_snapPt; } if (m_feedback != null) { m_feedback = new NewLineFeedbackClass(); m_feedback.Display = m_hookHelper.ActiveView.ScreenDisplay; m_feedback.Start(ppt); } else { m_feedback.AddPoint(ppt); } } public override void OnMouseMove(int Button, int Shift, int X, int Y) { IPoint ppt = m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(X, Y); m_snapPt = ppt; m_snapRst = m_Snapper.Snap(m_snapPt); m_SnapFeedback.Update(m_snapRst, 0); if (m_snapRst != null) { m_snapPt = m_snapRst.Location; } if (m_feedback != null) { m_feedback.MoveTo(m_snapPt); } } public override void OnMouseUp(int Button, int Shift, int X, int Y) { // TODO: Add SnapTool.OnMouseUp implementation } #endregion } }