ArcGIS 10桌面定制开发-COM方式
创建一个类库
开启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,为什么,下篇我们将会对迁移做一下介绍,欢迎讨论。
来自:http://bbs.esrichina-bj.cn/esri/viewthread.php?tid=105152&extra=page%3D1%26amp%3Bfilter%3Ddigest com方式定制
- 3
评分人数
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理