IHookHelper的用法

本文介绍了在ArcGIS Engine中使用IHookHelper接口的方法,包括实例化IHookHelper对象、通过IHookHelper获取地图控件和主窗体、获取IActiveView和IMap对象以及如何操作地图。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

IHookHelper 主要在用在自定义类型于AE带的的ICommand或ITool等,

1.实例化IHookHelper 对象:


IHookHelper m_hookHelper = new HookHelperClass(); 
m_hookHelper.Hook = this.axMapControl1.Object ;这样就可以把AxMapControl传递给其它要用到的地方。

2.通过IHookHelper,获取地图控件和主窗体:

IntPtr pHandle = new IntPtr (m_hookHelper.ActiveView.ScreenDisplay.hWnd);
axMapControl1 = System.Windows.Forms.Form.FromHandle(pHandle) as AxMapControl;//对这个地图控件对象操作,会直接反应到主窗体的地图控件上

Form. MainForm. = Form.FromHandle(pHandle).FindForm();//这里的主窗体对象之后运行时能起作用,MainForm. 不能直接访问到主窗体里的变量。

3.通过IHookHelper,获取IActiveView和IMap对象

再通过IHookHelper.ActiveView和IHookHelper.FocusMap属性来获取IActiveView和IMap对象,通过这两个接口进行更一步的操作.


4.通过IHookHelper,操作地图

IHookActions hookActions= m_hookHelper as IHookHelper;
获取IHookActions,再通过IHookActions进行Flash,Pan,ZoomTo操作.

HOOK实际是一个对象传出的自身的引用或者叫指针或者叫句柄。 
例如一个程序,加载一个dll内的对象时通过把Hook传递给要调用的对象,
这样dll内的对象就得到了应用程序传递给他的这个hook,
对象可以通过这个hook查看程序内部的结构。
实际实现时就是对象间传递指向自身的指针传递给另一个对象。

 

 

IHookHelper  m_hookHelper=new HookHelperClass();
m_hookHelper.Hook=axMapControl1.Object;
 //这样就获得了axMapControl1控件的一个引用
然后通过m_hookHelper.ActiveView可以获得原axMapControl1的ActiveView项,
用m_hookHelper.FocusMap可以获得IMap对象 


Provides access to members needed when developing commands to work with the MapControl, PageLayoutControl, ArcMap, and custom controls and applications.

Product Availability
Available with ArcGIS Engine.
Description

Use the IHookHelper interface to return the ActiveView, PageLayout or FocusMap of the hook passed to the ICommand::OnCreate event regardless of whether the hook is a MapControl, PageLayoutControl, ToolbarControl or ArcMap.

using System; using System.Drawing; using System.Linq; using System.Text; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; using System.IO; using System.Runtime.InteropServices; using MapControlApplication1; using ESRI.ArcGIS.esriSystem; using ESRI.ArcGIS.Carto; using ESRI.ArcGIS.Controls; using ESRI.ArcGIS.ADF; using ESRI.ArcGIS.SystemUI; using AE_test; using ESRI.ArcGIS.Display; using ESRI.ArcGIS.DataSourcesRaster; using ESRI.ArcGIS.Geodatabase; using ESRI.ArcGIS.Geometry; using ESRI.ArcGIS.Desktop.AddIns; namespace MapControlApplication1 { public delegate void AfterDrawGeometry(IGeometry geometry); public class DrawPolygoncs : ITool { private IGeometry _polygon=null;//定义一个几何对象,作为绘制结果 private INewPolygonFeedback _polyFeedback=null;//定义一个多边形反馈对象 private IPoint _startPoint=null;//多边形起始结点 private IPoint _endPoint=null;//多边形终止结点 private bool _drawStart=false;//多边形绘制开始标记 public event AfterDrawGeometry eventAfterDrawGeometry; protected AxMapControl myMapControl=null; protected ESRI.ArcGIS.Controls.IHookHelper myHook; //返回结果多边形 public IGeometry Polygon { get{ return _polygon;} } public override void OnCreate(object hook) { myHook.Hook= hook; if(myHook == null) myHook=new ESRI.ArcGIS.Controls.HookHelperClass(); if(_drawStart) { (myHook.Hook as IMapControl3).CurrentTool=this; _polyFeedback = new NewPolygonFeedbackClass(); _polyFeedback.Display=myHook.ActiveView.ScreenDisplay; } } public override void OnClick()//单击鼠标开始绘图或添加结点 { _polygon=null;//每次重设多边形为空值 _drawStart=true;//开始绘制标记置为true (myHook.Hook as IMapControl).CurrentTool=this; _polyFeedback=new NewPolygonFeedbackClass(); _polyFeedback.Display=myHook. ActiveView. ScreenDisplay; } public override void OnMouseDown(int Button, int Shift, int X, int Y) { if(Button ==1) { if(_startPoint == null)//如果是多边形第一个结点 { _startPoint =(myHook.FocusMap as IActiveView).ScreenDisplay. DisplayTransformation.ToMapPoint(X,Y); _polyFeedback.Start(_startPoint);//开始多边形绘制 } else { _endPoint =(myHook.FocusMap as IActiveView).ScreenDisplay. DisplayTransformation.ToMapPoint(X,Y); _polyFeedback.AddPoint(_endPoint);//添加多边形绘制结点 } } } public override void OnMouseMove(int Button, int Shift, int X, int Y) { if(_startPoint !=null) { IPoint movePoint=(myHook.FocusMap as IActiveView).ScreenDisplay. DisplayTransformation.ToMapPoint(X,Y); _polyFeedback.MoveTo(movePoint);//鼠标移动过程中实时显示反馈效果 } } public override void Refresh(int hDC) { base.Refresh(hDC); if (_polyFeedback !=null) { (_polyFeedback as IDisplayFeedback).Refresh(hDC);//实时显示反馈效果 } } public override void OnDblClick()//双击鼠标结束绘图 { _polygon=_polyFeedback.Stop(); _startPoint=null; _drawStart=false; } int ITool.Cursor { get { return 0; } // 返回默认光标 } bool ITool.Deactivate() { return true; // 允许工具取消激活 } bool ITool.OnContextMenu(int x, int y) { return false; // 不处理右键菜单 } void ITool.OnDblClick() { OnDblClick(); // 调用自定义的双击事件 } public void OnKeyDown(int keyCode, int shift) { throw new NotImplementedException(); } public void OnKeyUp(int keyCode, int shift) { throw new NotImplementedException(); } public void OnMouseUp(int button, int shift, int x, int y) { throw new NotImplementedException(); } } }
最新发布
06-12
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值