ArcGIS 10桌面定制开发-COM方式

创建一个类库

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

ArcGIS 10桌面定制开发-COM方式_其他ArcGIS 10桌面定制开发-COM方式_其他_02

下载 (89.04 KB)
2011-11-13 20:48

 


 


删除class1 文件

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

ArcGIS 10桌面定制开发-COM方式_其他 ArcGIS 10桌面定制开发-COM方式_其他_04

下载 (23.88 KB)
2011-11-13 20:48

 

添加命令模板

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

ArcGIS 10桌面定制开发-COM方式_其他 ArcGIS 10桌面定制开发-COM方式_其他_06

下载 (148.75 KB)
2011-11-13 20:48

 

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


ArcGIS 10桌面定制开发-COM方式_其他 ArcGIS 10桌面定制开发-COM方式_其他_08
下载 (41.25 KB)
2011-11-13 20:48

 

ArcGIS 10桌面定制开发-COM方式_其他 ArcGIS 10桌面定制开发-COM方式_其他_10

下载 (53.03 KB)
2011-11-13 20:48

 

 

编写相关代码


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

ArcGIS 10桌面定制开发-COM方式_其他 ArcGIS 10桌面定制开发-COM方式_其他_12

下载 (75.29 KB)
2011-11-13 20:48

 


 

  1.  
  2.   IMxDocument pMxd;
  3.         public CommandTest()
  4.         {
  5.             //
  6.             //
  7.             base.m_category = "COMTest"; //localizable text
  8.             base.m_caption = "COMTest";  //localizable text
  9.             base.m_message = "COMTest";  //localizable text
  10.             base.m_toolTip = "COMTest";  //localizable text
  11.             base.m_name = "COMTest";   //unique id, non-localizable (e.g. "MyCategory_ArcMapCommand")
  12.             try
  13.             {
  14.                 string bitmapResourceName = GetType().Name + ".bmp";
  15.                 base.m_bitmap = new Bitmap(GetType(), bitmapResourceName);
  16.             }
  17.             catch (Exception ex)
  18.             {
  19.                 System.Diagnostics.Trace.WriteLine(ex.Message, "Invalid Bitmap");
  20.             }
  21.         }
  22.         #region Overridden Class Methods
  23.  
  24.         public override void OnCreate(object hook)
  25.         {
  26.             if (hook == null)
  27.                 return;
  28.             m_application = hook as IApplication;
  29.             if (hook is IMxApplication)
  30.             {
  31.                 base.m_enabled = true;
  32.                 pMxd = m_application.Document as IMxDocument;
  33.             }
  34.             else
  35.             {
  36.                 base.m_enabled = false;
  37.             }
  38.                
  39.         }
  40.         public override void OnClick()
  41.         {
  42.  
  43.             IMap pMap = pMxd.FocusMap;
  44.             MessageBox.Show(pMap.Name);
  45.         }
  46.         /// <summary>
  47.         /// 检查是否可用
  48.         /// </summary>
  49.         public override bool Enabled
  50.         {
  51.             get
  52.             {
  53.                 return ISEnabled();
  54.             }
  55.         }
  56.         public bool ISEnabled()
  57.         {
  58.             int pLayerCount = pMxd.FocusMap.LayerCount;
  59.             if (pLayerCount > 0)
  60.                 return true;
  61.             else
  62.                 return false;
  63.         }
  64.       
  65.         #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进入该目录,然后使用一下命令注册:

 

 

ArcGIS 10桌面定制开发-COM方式_其他ArcGIS 10桌面定制开发-COM方式_其他_14

下载 (39.46 KB)
2011-11-13 21:18

 


ArcGIS 10桌面定制开发-COM方式_其他ArcGIS 10桌面定制开发-COM方式_其他_16

下载 (8.67 KB)
2011-11-13 21:18

 

 

使用自定义命令


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

 

 

ArcGIS 10桌面定制开发-COM方式_其他ArcGIS 10桌面定制开发-COM方式_其他_18

下载 (37.24 KB)
2011-11-13 20:48

 

ArcGIS 10桌面定制开发-COM方式_其他ArcGIS 10桌面定制开发-COM方式_其他_20

下载 (3.69 KB)
2011-11-13 20:48

 

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

ArcGIS 10桌面定制开发-COM方式_其他ArcGIS 10桌面定制开发-COM方式_其他_22

下载 (2.91 KB)
2011-11-13 20:48

 

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

 

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

ArcGIS 10桌面定制开发-COM方式_其他ArcGIS 10桌面定制开发-COM方式_其他_24

下载 (42.73 KB)
2011-11-13 20:48

 



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

 

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

 

来自:http://bbs.esrichina-bj.cn/esri/viewthread.php?tid=105152&extra=page%3D1%26amp%3Bfilter%3Ddigest com方式定制

 

 

3

评分人数