using System; using System.Drawing;
using System.Runtime.InteropServices; using ESRI.ArcGIS.ADF.BaseClasses; using ESRI.ArcGIS.Controls; using ESRI.ArcGIS.Carto; namespace AppGIS1 {
public sealed class ClearFeaSele : BaseCommand {
private IHookHelper m_hookHelper;
public ClearFeaSele() {
//改变继承类的属性
base.m_category = \; base.m_caption = \清除当前地图选择要素\; base.m_message = \清除当前地图选择要素\; base.m_toolTip = \清除当前地图选择要素\; base.m_name = \清除当前地图选择要素\; try {
//设置命令的图标
string bitmapResourceName = GetType().Name + \; base.m_bitmap = new Bitmap(GetType(), bitmapResourceName); }
catch (Exception ex) {
System.Diagnostics.Trace.WriteLine(ex.Message, \); } }
#region Overriden Class Methods
public override void OnCreate(object hook) {
if (hook == null) return;
if (m_hookHelper == null)
m_hookHelper = new HookHelperClass(); //将mapControl作为钩子传递 m_hookHelper.Hook = hook; }
public override void OnClick() {
m_hookHelper.FocusMap.ClearSelection();
//获取焦点地图的IActiveView接口
IActiveView pActiveView = (IActiveView)m_hookHelper.FocusMap; pActiveView.Refresh(); }
#endregion } }
2.6.3 自定义开发工具
自定义工具的开发需继承基类BaseTool,在类的构造函数中,需对自定义工具进行初始化。因工具需要鼠标与地图类控件(MapControl、PageLayoutControl等)进行交互,以完成某个特定功能。除需重写OnCreate()方法外,还要根据具体情况重写其它方法,如OnMouseDown()、OnMouseMove()和OnMouseUp()等。下例通过开发实现地图缩小的ZoomOut工具进行举例说明。基本步骤如下:
(1)建立新类MapZoomOutTool,需要继承BaseTool基类,如下图所示。在随后弹出的对话框中仍然选择MapControl or PageLayoutControl Tool选项。
图 自定义工具类继承BaseTool基类
(2)在类中需要判断用户是点击缩小还是拉框缩小,具体实现代码如下:
using System.Runtime.InteropServices; using ESRI.ArcGIS.ADF.CATIDs; using ESRI.ArcGIS.Carto; using ESRI.ArcGIS.Controls; using ESRI.ArcGIS.esriSystem; using ESRI.ArcGIS.Geometry; using ESRI.ArcGIS.ADF.BaseClasses; using ESRI.ArcGIS.ADF; using ESRI.ArcGIS.Display;
public sealed class MapZoomOutTool : BaseTool {
private INewEnvelopeFeedback m_feedBack; private IPoint m_point; private Boolean m_isMouseDown;
private IHookHelper m_HookHelper = new HookHelperClass(); public MapZoomOutTool() {
//设置command属性 base.m_caption = \缩小\; base.m_message = \缩小\; base.m_toolTip = \缩小\; base.m_name = \缩小\;
base.m_category = \;
base.m_bitmap = new System.Drawing.Bitmap(string.Format(\软件开发统一图标\\\\ForStockIcon\\\\ZoomOut.bmp\,Application.StartupPath));
base.m_cursor = new System.Windows.Forms.Cursor(string.Format(\软件开发统一图标\\\\ForStockIcon\\\\ZoomOut.cur\,Application.StartupPath)); }
public override void OnCreate(object hook) {
m_HookHelper.Hook = hook; }
public override bool Enabled { get {
if (m_HookHelper.FocusMap == null) return false; return true; } }
public override void OnMouseDown(int button, int shift, int x, int y) {
if (m_HookHelper.ActiveView == null) return; //如果是视图
if (m_HookHelper.ActiveView is IActiveView) {
//图上创建一个点 IPoint pPoint =
(IPoint)m_HookHelper.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(x, y); //得到地图框
IMap pMap = m_HookHelper.ActiveView.HitTestMap(pPoint); if (pMap == null) return;
if (pMap != m_HookHelper.FocusMap)
{
m_HookHelper.ActiveView.FocusMap = pMap;
m_HookHelper.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null); } }
//在焦点图上创建一个点
IActiveView pActiveView = (IActiveView)m_HookHelper.FocusMap;
m_point = pActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(x, y); m_isMouseDown = true; }
public override void OnMouseMove(int button, int shift, int x, int y) {
if (!m_isMouseDown) return; //得到焦点图
IActiveView pActiveView = (IActiveView)m_HookHelper.FocusMap; //初始一个范围
if (m_feedBack == null) {
m_feedBack = new NewEnvelopeFeedbackClass(); m_feedBack.Display = pActiveView.ScreenDisplay; m_feedBack.Start(m_point); }
base.m_cursor = new System.Windows.Forms.Cursor(string.Format(\软件开发统一图标\\\\ForStockIcon\\\\MoveZoomOut.cur\,Application.StartupPath)); //画范围
m_feedBack.MoveTo(pActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(x, y)); }
public override void OnMouseUp(int button, int shift, int x, int y) {
base.m_cursor = new System.Windows.Forms.Cursor(string.Format(\软件开发统一图标\\\\ForStockIcon\\\\ZoomOut.cur\,Application.StartupPath)); if (!m_isMouseDown) return; IEnvelope pEnvelope; IEnvelope pFeedEnvelope; double newWidth, newHeight; //得到焦点图
IActiveView pActiveView = (IActiveView)m_HookHelper.FocusMap; //如果不画范围
if (m_feedBack == null) {
//点击缩小当前范围
pEnvelope = pActiveView.Extent; pEnvelope.Expand(1.5, 1.5, true); pEnvelope.CenterAt(m_point);
} else {
//停止画框
pFeedEnvelope = m_feedBack.Stop();
if (pFeedEnvelope.Width == 0 || pFeedEnvelope.Height == 0) {
m_feedBack = null; m_isMouseDown = false; }
newWidth = pActiveView.Extent.Width * (pActiveView.Extent.Width / pFeedEnvelope.Width);
newHeight = pActiveView.Extent.Height * (pActiveView.Extent.Height / pFeedEnvelope.Height);
//建立新的范围坐标
pEnvelope = new EnvelopeClass();
pEnvelope.PutCoords(pActiveView.Extent.XMin - ((pFeedEnvelope.XMin - pActiveView.Extent.XMin) * (pActiveView.Extent.Width / pFeedEnvelope.Width)), pActiveView.Extent.YMin - ((pFeedEnvelope.YMin - pActiveView.Extent.YMin) * (pActiveView.Extent.Height / pFeedEnvelope.Height)), (pActiveView.Extent.XMin - ((pFeedEnvelope.XMin -
pActiveView.Extent.XMin) * (pActiveView.Extent.Width / pFeedEnvelope.Width))) + newWidth, (pActiveView.Extent.YMin - ((pFeedEnvelope.YMin -
pActiveView.Extent.YMin) * (pActiveView.Extent.Height / pFeedEnvelope.Height))) + newHeight); }
//建立新的视图范围
pActiveView.Extent = pEnvelope; pActiveView.Refresh(); m_feedBack = null; m_isMouseDown = false; } }
2.6.4 自定菜单开发实例
在ToolbarControl上不仅可以驻留命令和工具,还可以驻留菜单条。要在工具条上驻留菜单条,首先需要实现IMenuDef接口,在工具条上实现菜单功能,还需要将菜单中的所有命令类组织在一个项目文件(DLL)中,再在其它项目中添加该项目的引用。下面通过举例,将地图符号化的6个命令类和实现IMenuDef接口的类SymbologyMenu组织在一个项目Symbology中。
本实例将自定义下拉菜单和六种符号化的方法封装在了一个DLL中,并在新建的工程中引用封装好的DLL,具体步骤如下:
(1)新建DLL文件。打开VS2008,选择新建项目对话框中的“类库”,如下图所示,输入一个项目名,点击“确定”。
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库ArcGIS Engine控件编程(8)在线全文阅读。
相关推荐: