一、ICommand接口
ICommand接口为一个命令型接口,特点是当“命令按钮”按下时,会直接执行一段已经编写好的代码而无需外界交互,过程类似“宏”操作。
主要函数以及含义如下:
#region ICommand
/// <summary>
/// 命令按钮的图标(获取程序集文件中一个按钮图标文件的资源号)
/// </summary>
public int Bitmap
{ get; }
/// <summary>
/// 命令按钮的文字
/// </summary>
public string Caption
{ get; }
/// <summary>
/// 命令按钮所属类别
/// </summary>
public string Category
{ get; }
/// <summary>
/// 命令按钮是否被选择
/// </summary>
public bool Checked
{ get; }
/// <summary>
/// 命令按钮是否可用
/// </summary>
public bool Enabled
{ get; }
/// <summary>
/// 快捷帮助ID
/// </summary>
public int HelpContextID
{ get; }
/// <summary>
/// 帮助文件路径
/// </summary>
public string HelpFile
{ get; }
/// <summary>
/// 鼠标移动到按钮上是时状态栏出现的文字
/// </summary>
public string Message
{ get; }
/// <summary>
/// 按钮名称
/// </summary>
public string Name
{ get; }
/// <summary>
/// 按钮点击时触发的方法
/// </summary>
public void OnClick()
{
}
/// <summary>
/// 按钮产生时触发的方法
/// </summary>
/// <param name="Hook"></param>
public void OnCreate(object Hook)
{
}
/// <summary>
/// 鼠标移动到按钮上时弹出的文字
/// </summary>
public string Tooltip
{ get; }
#endregion
二、ITool接口
实现了ITool接口的插件对象在UI层上表现为一个工具按钮,工具按钮与命令按钮相似,其区别是前者点击后是开启一个交互过程而后者直接开始执行功能。
ArcMap中的“地图放大”工具就是一个Tool,按下该工具后,用户需要在地图上点击或拖放鼠标以显示更小范围的地图视图。
ArcMap中要产生一个Tool对象需要同时实现ICommand和ITool两个接口,其中ICommand定义启动Tool交互过程的方法,ITool接口则定义人机交互操作时需要的所有方法。
主要函数及其含义如下:
#region ITool
/// <summary>
/// 鼠标在地图上的样式
/// </summary>
public int Cursor
{ get; }
/// <summary>
/// Tool的激活状态设置
/// </summary>
/// <returns></returns>
public bool Deactivate()
{ }
/// <summary>
/// 鼠标点击右键弹出快捷菜单时触发的事件
/// </summary>
/// <param name="x"></param>
/// <param name="y"></param>
/// <returns></returns>
public bool OnContextMenu(int x, int y)
{ }
/// <summary>
/// 键盘某个按键点击时触发的事件
/// </summary>
/// <param name="keyCode"></param>
/// <param name="shift"></param>
public void OnKeyDown(int keyCode, int shift)
{ }
/// <summary>
/// 键盘某个按键点击后弹起时触发的事件
/// </summary>
/// <param name="keyCode"></param>
/// <param name="shift"></param>
public void OnKeyUp(int keyCode, int shift)
{ }
/// <summary>
/// 鼠标点击地图时触发的事件
/// </summary>
/// <param name="button"></param>
/// <param name="shift"></param>
/// <param name="x"></param>
/// <param name="y"></param>
public void OnMouseDown(int button, int shift, int x, int y)
{
}
/// <summary>
/// 鼠标在地图上移动时触发的事件
/// </summary>
/// <param name="button"></param>
/// <param name="shift"></param>
/// <param name="x"></param>
/// <param name="y"></param>
public void OnMouseMove(int button, int shift, int x, int y)
{
}
/// <summary>
/// 鼠标双击地图时触发的事件
/// </summary>
public void OnDblClick()
{
}
/// <summary>
/// 鼠标在地图上弹起时触发的事件
/// </summary>
/// <param name="button"></param>
/// <param name="shift"></param>
/// <param name="x"></param>
/// <param name="y"></param>
public void OnMouseUp(int button, int shift, int x, int y)
{ }
/// <summary>
/// 地图刷新时触发的事件
/// </summary>
/// <param name="hdc"></param>
public void Refresh(int hdc)
{ }
#endregion
在ArcGIS Engine中如果把ICommand接口和ITool接口混合为一个接口也是合适的,这样设计对插件的产生没有影响。