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 Files\ArcGIS\bin下面(我电脑是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,为什么,下篇我们将会对迁移做一下介绍,欢迎讨论。

posted @ 2014-03-07 10:30  奔跑的鸡丝  阅读(624)  评论(0编辑  收藏  举报