ArcGIS Engine控件编程(7)

2019-04-02 17:22

利用ToolbarControl控件建立GIS应用程序可快速构建类似ArcGIS DeskTop应用程序样的框架组成部分,但在下列情况下应用程序可能并不需要ToolbarControl:

?ToolbarControl的可视化外观可能不符合应用程序需要。 ?不需要实现ToolbarControl的命令对象。 ?应用程序中已有一个现有的应用程序框架。

?ToolbarControl及其驻留的命令不易于跨多个伙伴控件使用。

在上述情况下,开发人员必须直接操作MapControl、PageLayoutControl、SceneControl、GlobeControl和ReaderControl。应用程序可能需要诸如命令按钮、状态条和列表框等用户界面组件,这些组件可由开发环境提供。

作为选择,AE提供的控件命令(ControlCommands)或者使用HookHelper、GlobeHookHelper或SceneHookHelper直接操作单个的AE控件。但开发人员只需在适当的时候调用ICommand:OnCreate和ICommand:OnClick方法,以读取ICommand接口上的属性,以便建立用户界面。

通过编程创建命令的一个新例程,并将单个AE控件传递给OnCreate事件。如要用3D的放大到全图“ZoomToFullExtent”命令操作GlobeControl,则GlobeControl必须作为“钩子(hook)”传递给OnCreate方法。

开发人员可以使用脱离ToolbarControl的命令池(CommandPool)对象,以便管理应用程序所使用的命令。命令池支持基于命令的“钩子(hook)”属性,调用各个命令的OnCreate方法。

如果命令只实现了ICommand接口,开发人员可以在适当的时候调用OnClick方法以执行特定行为。如果命令为实现了ICommand接口和ITool接口的工具,开发人员必须将该工具设置为AE控件中的CurrentTool,AE控件会将任何键盘和鼠标事件传送给该工具。如下面的示例所示:

ICommand pCmd;

pCmd = new ControlsSelectFeaturesToolClass(); pCmd.OnCreate(axMapControl1.Object);

axMapControl1.CurrentTool = pCmd as ITool;//将pCmd定义为操控当前axMapControl1的工具

2.6 应用开发实例

2.6.1 概述

命令和工具是ToolbarControl控件上最常用的两种对象。当命令对象被驻留到

ToolbarControl控件上后,就会立即调用ICommand:OnCreate方法,将一个句柄(handle)或钩子(hook)传递给该命令操作的应用程序。在命令实现时,先要查看被传递的钩子是否是命令可以操作的对象,若被传递的钩子不被支持,命令将自动失效。若钩子被支持,命令将存储该钩子,以便以后使用。如“打开地图文档”命令要操作MapControl或PageLayoutControl,则MapControl或PageLayoutControl将作为钩子被传递给OnCreate方法,该命令就会存储该钩子,以便后续使用。

若ToolBarControl被作为钩子传递给OnCreate事件,则命令一般会通过Buddy属性检查与该工具条协同使用的伙伴控件类型。当驻留在ToolbarControl上的一个命令只能操作

ReaderControl,而该ToolbarControl控件的伙伴控件却是MapControl,则该命令将自动失效。

HookHelper、GlobeHookHelper和SceneHookHelper可以帮助开发人员创建自定义命令,以操作ArcGIS控件。

?HookHelper用于帮助开发人员创建能操作MapControl、PageLayoutControl和

ToolbarControl桌面应用程序的自定义命令。

?SecneHookHelper用于帮助开发人员创建能操作SceneControl和ToolbarControl桌面应用程序的自定义命令。

?GlobeHookHelper用于帮助开发人员创建操作GlobeControl和ToobarControl桌面应用程序的自定义命令。

并不是由开发人员向命令的OnCreate方法中添加代码以确定传递给该命令的钩子的类型,而是由helper对象来处理这个任务。Helper对象用于控制钩子,并返回ActiveView对象、PageLayout对象、Map对象、Globe对象和Scene对象,而不管被传递的是何种类型的钩子。当终端用户单击工具条上的某个命令项时,ICommand:OnClick方法被调用。根据钩子类型,利用钩子访问来自伙伴控件的所需对象来完成某项工作。IHookHelper是HookHelper的主接口,其属性如下表所示。

表 IHookHelper接口的主要属性

属性类型 属性名称 ActiveView FocusMap Hook OperationStack PageLayout 功能描述 被关联控件或应用程序的活动视图。 被关联控件或应用程序的焦点地图。 关联多项,该对象与ICommand:OnCreate中被传递的对象一致。 被关联控件或应用程序的操作栈,用于取消与恢复操作。 被关联控件或应用程序的PageLayout。 一般情况下所有的命令对象都要实现ICommand接口的所有成员,所有的工具对象都要

实现ICommand和ITool两个接口的所有成员。为简化自定义命令和工具的开发,ESRI提供了BaseCommand和BaseTool两个抽象基类。这两个类都是抽象类,不能直接被实例化,只能被其它类继承使用。这两个基类被定义在ESRI.ArcGIS.Utility程序集中,属于ESRI.ArcGIS.Utility.BaseClasses命名空间。

这两个基类为ICommand和ITool每个成员提供了缺省实现,这样就简化了创建自定义命令和工具的过程。开发者不用为每个成员提供实现代码,只需重载自定义命名或工具所需的成员,如ICommand:OnCreate,该成员在初始化的类中,必须重载,以便完成用户希望的操作。

在VS.NET开发环境中,为ArcGIS应用程序创建命令和工具,推荐使用这些基类。以便能够更快速、更简单、更少出错地创建命令和工具。BaseClasses有两种:BaseCommand和BaseTool,它们都有重载的构造函数,使得用户可以快速地通过构造函数参数设置命令和工具的许多属性。

重载的BaseCommand构造函数有以下签名:

public BaseCommand(System.Drawing.Bitmap bitmap, string caption, string category, int helpContextId, string helpFile, string message, string name,

string toolTip);

重载的BaseTool构造函数有以下签名:

public BaseTool(System.Drawing.Bitmap bitmap, string caption, string category,

System.Windows.Forms.Cursor cursor, int helpContextId, string helpFile, string message,

string name, string toolTip);

(1)继承基类

当编写一个新类时,可以使用这些参数化的构造函数。下面是一个名为PanTool的新类,它继承了BaseTool类。

public PanTool():base(null,\地图漫游\,\,CursorType,0,\,\地图漫游

\,\,\)

{ //...

}

(2)直接设置基类成员

作为使用参数化构造函数的备选方案,可以直接设置基类成员。基类暴露其内部成员变量给继承类,每个属性一个,这样就可以在继承类中直接访问它们。例如,代替使用构造函数设置Caption属性或重载Caption函数,可以在继承类的构造函数中,设置基类中声明的m_caption类成员变量。

(3)重载成员

当创建继承一个基类的自定义命令和工具时,可能需要重载几个成员。当重载类中的一个成员时,会执行用户提供给该成员的实现代码,而不会执行从基类继承而来的实现代码。

在下面的开发实例中,将结合HookHelper和基类(BaseCommand或BaseTool)进行自定义命令、工具及菜单的开发。

2.6.2 自定义命令开发实例

当定义新类开发自定义命令时,需要继承基类BaseCommand,一般只需重写OnCreate()和OnClick()方法。在类的构造函数中,需要对自定义命令类进行初始化。下面通过两个自定义命令进行举例说明。

(1)清除当前活动工具的命令

在GIS应用程序操作过程中,某个工具一旦使用,若不使用下一个工具,它将一直处于活动状态,这将给软件操作带来不便。可以开发一个工具,清除ToolbarControl上当前的活动工具。具体步骤如下:

1)点击开发环境中的项目菜单,选择其中的添加新类,在弹出的对话框中,选择左侧类别列表框中的ArcGIS,选择右侧模板列表框中的BaseCommand,输入新建类名称,本例为GeoMapComm,点击底部的添加按钮,在弹出的对话框中,选择MapControl or PageLayoutControl Tool选项,就能生成一个名为GeoMapComm的新类。

2)在类中定义IToolbarControl的接口变量pToolbarControl,并在类的构造函数中,改变所继承的基类属性。

3)在OnCreate重载函数中,将hook显示转换为IToolbarControl,并赋给pToolbarControl

变量。

4)在OnClick重载函数中,将pToolbarControl接口变量的CurrentTool属性,将其设置为空即可。

图 自定义命令类继承BaseCommand基类

图 自定义工具用于操作MapControl或PageLayoutControl

5)全部代码如下:

using System; using System.Drawing;

using System.Runtime.InteropServices; using ESRI.ArcGIS.ADF.BaseClasses; using ESRI.ArcGIS.ADF.CATIDs; using ESRI.ArcGIS.Controls;

namespace AppGIS1//包含类的项目名称

{

public sealed class GeoMapComm : BaseCommand {

IToolbarControl pToolbarControl; public GeoMapComm() {

//在构造函数可以改变类的属性

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;

pToolbarControl= hook as IToolbarControl; }

public override void OnClick() {

//添加用户点击时的操作,以清除当前活动工具 pToolbarControl.CurrentTool = null; }

#endregion } }

6)利用下面的代码可将命令添加到ToolbarControl控件上。

axToolbarControl1.AddItem(new GeoMapComm(), -1, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly);

(2)清除当前地图中的选择要素

下面通过自定义命令,以清除当前地图中的选择要素。步骤与上例一样,所建新类名为ClearFeaSele。具体软件代如下:


ArcGIS Engine控件编程(7).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:2014高考数学试题精校版解析版安徽理

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: