创建一个类库
开启VS2008,以Visual C# >> ArcGIS >>Extending ArcObjects 下的Class Library (ArcMap)为模板创建一个新类库项目,将该项目命名为ArcMapCOM,选择合适的存储位置,单击确定,如下图所示:
删除class1 文件
点击完成后,项目创建了默认的class1.cs 文件,因为在该项目中不会使用该文件,所以删除该文件,如下图:
添加命令模板
添加一个命令模板,在项目上右键,添加,然后找到ArcGIS/Extending ArcObjects/BaseCommand,如下图:
点击添加后,弹出ArcGIS Project Wizard,可以利用该向导添加ESRI 对象库引用。因为现在创建的是ArcGIS Desktop 应用程序,所以只有与ArcGIS Desktop 相关的程序集,ESRI 提供的ESRI.ArcGIS.ADF.Local 程序集包含了ESRI.ArcGIS.ADF.BaseClasses 命名空间,可以继承该程序集所提供的一些抽象类来创建一个自定义命令/工具。该程序集还包含了ESRI.ArcGIS.ADF.CATIDs 命名空间,其中的一些类可用于注册组件至合适的ESRI组件类别。我们选择的dll如下:
编写相关代码
向导为我们生成了下面的模板,我们需要添加相应的代码,如下图:
-
- IMxDocument pMxd;
- public CommandTest()
- {
- //
- //
- base.m_category = "COMTest"; //localizable text
- base.m_caption = "COMTest"; //localizable text
- base.m_message = "COMTest"; //localizable text
- base.m_toolTip = "COMTest"; //localizable text
- base.m_name = "COMTest"; //unique id, non-localizable (e.g. "MyCategory_ArcMapCommand")
- try
- {
- string bitmapResourceName = GetType().Name + ".bmp";
- base.m_bitmap = new Bitmap(GetType(), bitmapResourceName);
- }
- catch (Exception ex)
- {
- System.Diagnostics.Trace.WriteLine(ex.Message, "Invalid Bitmap");
- }
- }
- #region Overridden Class Methods
-
- public override void OnCreate(object hook)
- {
- if (hook == null)
- return;
- m_application = hook as IApplication;
- if (hook is IMxApplication)
- {
- base.m_enabled = true;
- pMxd = m_application.Document as IMxDocument;
- }
- else
- {
- base.m_enabled = false;
- }
-
- }
- public override void OnClick()
- {
-
- IMap pMap = pMxd.FocusMap;
- MessageBox.Show(pMap.Name);
- }
- /// <summary>
- /// 检查是否可用
- /// </summary>
- public override bool Enabled
- {
- get
- {
- return ISEnabled();
- }
- }
- public bool ISEnabled()
- {
- int pLayerCount = pMxd.FocusMap.LayerCount;
- if (pLayerCount > 0)
- return true;
- else
- return false;
- }
-
- #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进入该目录,然后使用一下命令注册:
使用自定义命令
打开ArcMap 通过Customize找到这个命令,然后拖到菜单上,如下:
当我们将图层删掉后,发现命令不可用了,如下图:
这就是因为我们在这个命令中写了一个判断,当图层的个数小于1的时候Enabled属性为false,而ArcMap自动检查这个属性,当属性为false的时候,命令不可用。
当我们点这个按钮的时候,出现如下信息:
这说明我们的自定义命令是成功的。
小结:ArcGIS 10 提供了Add-In的开发模式(http://bbs.esrichina-bj.cn/esri/thread-105114-1-1.html),但是同时保留了早期的COM的这种方式,建议大家在使用的时候都使用Add-In,为什么,下篇我们将会对迁移做一下介绍,欢迎讨论。