zoukankan      html  css  js  c++  java
  • ArcGIS桌面开发之—COM模式

    创建一个类库

    开启VS2008,以Visual C# >> ArcGIS >>Extending ArcObjects 下的Class Library (ArcMap)为模板创建一个新类库项目,将该项目命名为ArcMapCOM,选择合适的存储位置,单击确定,如下图所示:

    1.jpg



    删除class1 文件

    点击完成后,项目创建了默认的class1.cs 文件,因为在该项目中不会使用该文件,所以删除该文件,如下图:

    3.jpg

    添加命令模板

    添加一个命令模板,在项目上右键,添加,然后找到ArcGIS/Extending ArcObjects/BaseCommand,如下图:

    4.jpg

    点击添加后,弹出ArcGIS Project Wizard,可以利用该向导添加ESRI 对象库引用。因为现在创建的是ArcGIS Desktop 应用程序,所以只有与ArcGIS Desktop 相关的程序集,ESRI 提供的ESRI.ArcGIS.ADF.Local 程序集包含了ESRI.ArcGIS.ADF.BaseClasses 命名空间,可以继承该程序集所提供的一些抽象类来创建一个自定义命令/工具。该程序集还包含了ESRI.ArcGIS.ADF.CATIDs 命名空间,其中的一些类可用于注册组件至合适的ESRI组件类别。我们选择的dll如下:


    5.jpg


    2.jpg

    编写相关代码


    向导为我们生成了下面的模板,我们需要添加相应的代码,如下图:

    6.jpg



    1.   IMxDocument pMxd;
    2.         public CommandTest()
    3.         {
    4.             //
    5.             //
    6.             base.m_category = "COMTest"; //localizable text
    7.             base.m_caption = "COMTest";  //localizable text
    8.             base.m_message = "COMTest";  //localizable text 
    9.             base.m_toolTip = "COMTest";  //localizable text 
    10.             base.m_name = "COMTest";   //unique id, non-localizable (e.g. "MyCategory_ArcMapCommand")
    11.             try
    12.             {
    13.                 string bitmapResourceName = GetType().Name + ".bmp";
    14.                 base.m_bitmap = new Bitmap(GetType(), bitmapResourceName);
    15.             }
    16.             catch (Exception ex)
    17.             {
    18.                 System.Diagnostics.Trace.WriteLine(ex.Message, "Invalid Bitmap");
    19.             }
    20.         }
    21.         #region Overridden Class Methods

    22.         public override void OnCreate(object hook)
    23.         {
    24.             if (hook == null)
    25.                 return;
    26.             m_application = hook as IApplication;
    27.             if (hook is IMxApplication)
    28.             {
    29.                 base.m_enabled = true;
    30.                 pMxd = m_application.Document as IMxDocument;
    31.             }
    32.             else
    33.             {
    34.                 base.m_enabled = false;
    35.             }
    36.                
    37.         }
    38.         public override void OnClick()
    39.         {

    40.             IMap pMap = pMxd.FocusMap;
    41.             MessageBox.Show(pMap.Name);
    42.         }
    43.         /// <summary>
    44.         /// 检查是否可用
    45.         /// </summary>
    46.         public override bool Enabled
    47.         {
    48.             get
    49.             {
    50.                 return ISEnabled();
    51.             }
    52.         }
    53.         public bool ISEnabled()
    54.         {
    55.             int pLayerCount = pMxd.FocusMap.LayerCount;
    56.             if (pLayerCount > 0)
    57.                 return true;
    58.             else
    59.                 return false;
    60.         }
    61.       
    62.         #endregion
    复制代码


    其中ISEnabled函数用来检查是否可用,因为Enable的属性是定义在父类中的,ArcMap自动会检查该属性,应该是500毫秒,当这个属性为false的时候,命令不可用,而OnCreate函数在构造函数调用之后,也由系统调用,传入了一个Hook,这个Hook可以这么认为,我们自定义了一个命令,那么这个命令是和那个应用程序做交互呢,因为我们选择的是ArcMap,所以可以认为这个hook就是ArcMap。


    注册



    因为是COM的,所以就存在注册,记住在ArcGIS 10 中,Esri提供了一个注册工具,以后只能用这个工具注册,用微软的regsvr32 注册会失败,该工具在C:Program Files (x86)Common FilesArcGISin下面(我电脑是64位的,这个路径因系统而有不同),工具就是ESRIRegAddIn.exe,我们从CMD进入该目录,然后使用一下命令注册:

    11.jpg


    12.jpg

    使用自定义命令


    打开ArcMap 通过Customize找到这个命令,然后拖到菜单上,如下:

    7.jpg

    8.jpg

    当我们将图层删掉后,发现命令不可用了,如下图:

    9.jpg

    这就是因为我们在这个命令中写了一个判断,当图层的个数小于1的时候Enabled属性为false,而ArcMap自动检查这个属性,当属性为false的时候,命令不可用。

    当我们点这个按钮的时候,出现如下信息:

    10.jpg



    这说明我们的自定义命令是成功的。

    小结:ArcGIS 10 提供了Add-In的开发模式(http://bbs.esrichina-bj.cn/esri/thread-105114-1-1.html),但是同时保留了早期的COM的这种方式,建议大家在使用的时候都使用Add-In,为什么,下篇我们将会对迁移做一下介绍,欢迎讨论。

  • 相关阅读:
    古典兔子问题
    (I/O流)在100ms内桌面上生成一个200M大小的文件
    搭建手机UI自动化
    关于String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    关于数据库范式的理解
    Orcl分页查询的语法示例
    Eclipse alt+/语法不提示的解决方法
    redis 使用rdb从高版本迁移至低版本
    redis集群详解
    Linux firewall防火墙设置
  • 原文地址:https://www.cnblogs.com/giser-whu/p/3707045.html
Copyright © 2011-2022 走看看