许可优化
许可优化
产品
产品
解决方案
解决方案
服务支持
服务支持
关于
关于
软件库
当前位置:服务支持 >  软件文章 >  ArcGIS Engine——ICommand接口详解

ArcGIS Engine——ICommand接口详解

阅读数 15
点赞 0
article_banner

ICommand

​在ArcEngine类库中有大量的Command 控件 用来与地图控件进行操作和交互。比如有一系列的地图浏览控件、地图查询控件、图斑选取控件、编辑控件来与MapControlPageLayoutControl进行交互。这些控件被包含ESRI.ArcGIS.Controls.dll类库中,位于ESRI.ArcGIS.Controls命名空间下。

​ 这些内置的Command控件可以单独实例化来使用,也可以被安置在一个AxToolbarControl工具栏控件中,继而被存放在一个CommandPool池中以备调用。

  1. 第一种使用方式是实例化一个Command对象并显式地运行它:
ICommand cmd = new ControlsOpenCommandClass();
cmd.OnCreate(axMapControl1.Object);
cmd.OnClick();

​ 其中ControlsOpenDocCommandClass就是一个Command控件,通过调用它的OnCreate方法传递给它需要交互的MapControl,然后调用它的OnClick方法就可以运行。上面的例子会激活一个打开地图文档的 对话框  

  1. 另一种方法是更加常用的方法: 由于每个Command对象都是一个COM组件,所以ESRI.ArcGIS.Controls下的各个类只是对底层的COM对象的一种封装。由于是COM对象,所以每一个Command对象都有自己的CLSID和ProgID,并在安装Engine Runtime的时候被注册了,你可以在注册表的HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\找到这些Command的注册信息。由于是COM组件,在实例化它的过程中,.net需要实例化一个Runtime Callable Wrapper(RCW)对象,来代理对COM组件的调用。

​ 由于大部分对地图控件的操作都直接或间接的来自于工具栏,比如点击工具栏上面的放大、缩小、全图按钮。那么实际上我们的绝大部分Command对象都可以被寄放到这个工具栏之中。方法非常简单:

axToolbarControl1.AddItem("esriControls.ControlsMapZoomInTool");

​ 此处使用的esriControls.ControlsMapZoomInTool就是ControlsMapZoomInToolClass类所指向的COM组件的ProgID

​ 通过AddItem添加到工具栏中的Command控件使用非常方便,添加了它以后你就再不用操心进一步的处理它与地图控件的交互了。Engine内部是怎么做到这一点的呢,记得我们在第一种方法中实例化一个Command控件时调用的OnCreate方法吗,当时我们传递给它一个MapControl来告诉它需要 控制 哪一个地图控件。而通过axToolbarControl1.AddItem添加的控件,由于ToolbarControl将这个控件放到自己的控件池时,就已经调用了它的OnCreate方法,并传递给了它自己的BuddyControl作为控制对象

​ 在实际开发 项目  中,我们往往不想暴露出ArcEngine内置的ToolBar控件,而是给用户展示我们自己开发的工具栏控件。另一方面,我们也想使用这种简单的添加控件机制。如果做到呢,方法就是在设计阶段,仍然拖放一个ToolbarControl到窗体上,但是在属性中将它的Visible设置为false,这样就不会显示出来了,而我们可以往这个工具栏中添加大量的Command控件。

​ 这个隐藏的工具栏如何使用呢,请看下面这个函数:

private void setCurrentTool(string commandName)
{
    axMapControl1.CurrentTool = null;
    for(int i=0; i<axToolbarControl1.CommandPool.Count; i++)
    {
        // get_Command(int index),通过索引值index返回对应的command
        ICommand cmd = axToolbarControl1.CommandPool.get_Command(i);
        if(cmd.Name == commandName)
        {
            // 要进行接口的转换,从ICommand转换成ITool
            axMapControl1.CurrentTool = cmd as ITool;
            cmd.OnClick();
            break;
        }
    }
}

​ 前面提到ToolbarControl内部维护一个Command池,在这个池中存放了所有已添加的Command对象,获取其中的Command可以通过CommandPool的get_Command方法,通过比较Command的名称,可以得到想要的Command对象。这个名称可不同于ProgID,它是另一个用来标识Command控件的 字符串  ,比如我们之前添加的ZoomInTool控件,它的ProgID是esriControls.ControlsMapZoomInTool,它的Name是ControlToolsMapNavigation_ZoomIn

​ 当Command对象处理的不只是打开地图,显示全图这类没有与地图交互的功能时,简单的使用OnClick即可,但是当需要的是拖动鼠标控制缩放,空间查询这类必须与地图进行交互的动作时,就必须设置MapControlCurrentTool属性。

上述原理转载自https://www.cnblogs.com/marvelousone/p/7417963.html

应用

ICommand的Name

"ControlToolsMapNavigation_ZoomIn"

"ControlToolsMapNavigation_ZoomOut"

"ControlToolsMapNavigation_ZoomInFixed"

"ControlToolsMapNavigation_ZoomOutFixed"

"ControlToolsMapNavigation_Pan"

"ControlToolsMapNavigation_FullExtent"

"ControlToolsMapNavigation_ZoomToLastExtentBack"

"ControlToolsMapNavigation_ZoomToLastExtentForward"

用ICommand实现地图显示

private void tspPan_Click(object sender, EventArgs e)
{
    basicOperatorTool = "Pan";
    setCurrentTool("ControlToolsMapNavigation_Pan");
}
private void tspZoomIn_Click(object sender, EventArgs e)
{
    basicOperatorTool = "ZoomIn";
    setCurrentTool("ControlToolsMapNavigation_ZoomIn");
}
private void tspZoomOut_Click(object sender, EventArgs e)
{
    basicOperatorTool = "ZoomOut";
    setCurrentTool("ControlToolsMapNavigation_ZoomOut");
}
private void tspFullExtent_Click(object sender, EventArgs e)
{
    basicOperatorTool = "FullExtent";
    setCurrentTool("ControlToolsMapNavigation_FullExtent");
}
private void tspBack_Click(object sender, EventArgs e)
{
    basicOperatorTool = "Back";
    setCurrentTool("ControlToolsMapNavigation_ZoomToLastExtentBack");
}
private void tspForward_Click(object sender, EventArgs e)
{
    basicOperatorTool = "ForWard";
    setCurrentTool("ControlToolsMapNavigation_ZoomToLastExtentForward");
}

private void setCurrentTool(string commandName)
{
    axMapControl1.CurrentTool = null;
    for(int i=0; i<axToolbarControl1.CommandPool.Count; i++)
    {
        ICommand cmd = axToolbarControl1.CommandPool.get_Command(i);
        if(cmd.Name == commandName)
        {
            axMapControl1.CurrentTool = cmd as ITool;
            cmd.OnClick();
            break;
        }
    }
}



免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删



相关文章
技术文档
QR Code
微信扫一扫,欢迎咨询~
customer

online

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 board-phone 155-2731-8020
close1
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

姓名不为空

姓名不为空
手机不正确

手机不正确

手机不正确
公司不为空

公司不为空

公司不为空