在过去的工作中,采用ArcEngine 编写了几个程序,同一个程序又分ArcEngine9.0和9.2版本。在后续的维护中,感觉非常麻烦。升级一个功能,得把几个程序的代码都打开,复制,粘帖,再编译,再测试,这样的工作十分繁杂,基本是是时间的浪费。
在痛苦之后,静心反思,觉得这样的开发模式效率很差,系统不容易维护。每个变化都给自己增加不少麻烦。这样的程序,大部分时间浪费在菜单建立、工具栏按纽设计、增加映射代码上去了。因此决定重新设计一个插件式的框架系统。
这样的系统采用VC++实现,我验证两种办法,两种方法都是可行的。一种是采用COM实现,另外就是采用普通的DLL实现。采用COM实现,系统相对更容易扩展,毕竟采用其它编程语言按照约定接口实现的模块也很容易加到系统中来。采用普通DLL实现,好处就是比COM方式更加简单,更容易实现。综合衡量,我最终采用普通DLL方式实现系统。
系统框架中,我增加了一个基本的功能,一个在视图界面上提供了一个MapConreol控件,该控件用来容纳地图数据,设计了一个可停靠可的图层目录管理,再就是一个鹰眼控件。
不管采用什么方式,系统都必须要设计一个关键模块:插件管理模块。插件管理模块实现DLL的加载,接收框架传来的各种命令,转发到各个插件去。另外系统还必须提供部分其它接口方便插件访问。
1、插件管理模块
插件加载。
系统命令事件的分发。
2、提供给插件使用的系统功能
查询地图控件
请求、查询以及设置命令ID。每个插件都自己维护自己的一个操作状态ID。
往框架上增加一个停靠的窗体。
查询当前选择的图层。
查询系统命令ID变化监控接口,方便插件随时知道框架的命令变化。
其它功能。
3、插件模块
插件模块都必须提供系统约定的接口,否则将不会被插件管理模块承认。
系统插件管理界面,是采用Xtreme ToolkitPro 界面库实现。目前实现的界面如下:
今天设计了一些接口
[, helpstring("方法GetMapCtrl")] HRESULT GetMapCtrl(IDispatch** object);
[, helpstring("方法GetPageCtrl")] HRESULT GetPageCtrl(IDispatch** object);
[, helpstring("方法GetCmdID")] HRESULT GetCmdID(IUnknown** pVal);
[, helpstring("方法SetTitle")] HRESULT SetTitle(BSTR title);
[, helpstring("方法SetStatusText")] HRESULT SetStatusText(LONG index, BSTR text);
[, helpstring("方法ShowPane")] HRESULT ShowPane(BSTR name);
[, helpstring("方法GetSelectedLayer")] HRESULT GetSelectedLayer(IUnknown** layer);
[propget, helpstring("属性 CustomProperty")] HRESULT CustomProperty(LONG type, [out, retval] VARIANT* pVal);
[propput, helpstring("属性 CustomProperty")] HRESULT CustomProperty(LONG type, [in] VARIANT newVal);
阅读(3219) | 评论(3) | 转发(0) |