利用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。具体软件代如下:
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库ArcGIS Engine控件编程(7)在线全文阅读。
相关推荐: