|
阅读:954回复:0
组件对象模型(COM)和ArcInfo 8的定制
<FONT face=Arial>ArcInfo 8</FONT>不仅继承了<FONT face=Arial>ArcInfo</FONT>已有的核心模块,还包含了三个新的应用程序<FONT face=Arial>-ArcCatalog</FONT>、<FONT face=Arial>ArcMap</FONT>和<FONT face=Arial>ArcToolbox</FONT>。并全面采用组件对象模型(<FONT face=Arial>COM</FONT>)技术,提出了一系列基于<FONT face=Arial>COM</FONT>的新概念,如:面向组件对象的<FONT face=Arial>GIS</FONT>等,从而使<FONT face=Arial>GIS </FONT>与现代的软件技术及其他计算机技术的发展趋势相一致,为<FONT face=Arial>GIS </FONT>与<FONT face=Arial>IT</FONT>主流计算机应用打下了坚实的基础,<FONT face=Arial>ArcInfo 8</FONT>也因此成为下个世纪<FONT face=Arial>GIS</FONT>技术的先导。
<P ><b>组件对象模型(<FONT face=Arial>COM</FONT>)基础 </b><FONT face=Arial>COM</FONT>的英文全称是<FONT face=Arial>Component Object Model</FONT>(组件对象模型),它是微软公司提出的一种用于开发和支持程序对象组件的框架。<FONT face=Arial>COM</FONT>由一些对象和对象的接口组成。在<FONT face=Arial>COM</FONT>里,接口提供对象操作的机制。而接口是由一个或多个相关的方法、属性和事件组成的。一般来讲方法代表对象要执行的一些动作。属性表示对象的一个特殊情况如<FONT face=Arial>Count</FONT>和<FONT face=Arial>Name</FONT>。事件是与对象相关的事情发生时通知系统其余对象的方法。这样接口就决定了如何与对象的一个客户进行交互,操作对象并确定利用该对象可以或不可以做什么。下面这个图表说明了这种关系。 </P> <P align=center><IMG src="http://www.esrichina-bj.cn/library/chinanews/image/com-1.gif"></P> <P >在<FONT face=Arial>COM</FONT>里通过一个接口来实现这些机制,而且接口可以在已有的定义上扩展,实际 上所有的组件都是在已有的组件框架上扩展出来的。不管其实现接口功能是怎样实现的,外部应用都是以同样的方法与其打交道的,这个接口实质上是某一类目标的定义框架。应用可以只需要组件接口就可以编译执行,具体的组件实现可根据需要开发。 从本质上讲,<FONT face=Arial>COM </FONT>组件是以<FONT face=Arial>Win32</FONT>动态链接库(<FONT face=Arial>DLLs</FONT>)或可执行文件(<FONT face=Arial>EXEs</FONT>)的形式发布的可执行代码组成的。<FONT face=Arial>COM</FONT>组件是动态链接的,但动态链接本身并不能满足对于组件的需求,为满足这些需求,组件还必须是封装的。而对于<FONT face=Arial>COM</FONT>组件的封装是很容易的,这是因为: ● <FONT face=Arial>COM</FONT>组件是完全与语言无关的。任何过程性语言都可以用来开发组件; ● <FONT face=Arial>COM</FONT>组件可以以二进制的形式发布; ● <FONT face=Arial>COM</FONT>组件可以在不妨碍老客户的情况下被升级; ● <FONT face=Arial>COM</FONT>组件可以透明地在网络上被重新分配位置; <FONT face=Arial>COM</FONT>组件是给其它应用程序提供面向对象的<FONT face=Arial>API</FONT>或服务的极好方法。对于可用于快速构造应用程序、与语言无关的组件库的建立,<FONT face=Arial>COM</FONT>组件也不在话下。 这里需要帮助大家澄清几个概念: ● <FONT face=Arial>COM </FONT>不是一种计算机语言,<FONT face=Arial>COM</FONT>所说明的是如何编写组件,但具体选用什么语言则完全是自由的; ● <FONT face=Arial>COM </FONT>不是<FONT face=Arial>DLL</FONT>,<FONT face=Arial>COM</FONT>是使用了<FONT face=Arial>DLL</FONT>来给组件提供动态链接的能力; ● <FONT face=Arial>COM </FONT>也不是像<FONT face=Arial>WIN32 API </FONT>那样的函数集,<FONT face=Arial>COM</FONT>更主要的是一种编写能够按面向对象<FONT face=Arial>API</FONT>形式提供服务的组件的方法; ● <FONT face=Arial>COM</FONT>也并不是类似<FONT face=Arial>Microsoft</FONT>基本类库这样的<FONT face=Arial>C++</FONT>类库。<FONT face=Arial>COM</FONT>给开发人员提供的是一种开发与语言无关的组件库的方法,但<FONT face=Arial>COM</FONT>本身并没有提供任何实现。 那么使用<FONT face=Arial>COM </FONT>到底有那些好处呢?最明显的优点就是应用程序对其局部进行更新而保持其余部分不变。除此之外,使用组件还有一些使对已有的应用程序的升级更加方便和灵活的优点: ● 可以定制应用程序:用户通常希望能够定制他们所用的应用程序,以使应用程序能够按他们自己的工作方式工作,在编程人员建立定制方案时,他们需要的是可被修改的应用程序,而组件本质上讲就是可被定制的; ● 可以使开发人员从某个组件库中取出所需的某个组件快速组装到一起,以构造所需的应用程序,从而加快应用程序的开发; ● 可以使得开发分布式应用程序的过程得以简化。 因此,<FONT face=Arial>ESRI</FONT>在<FONT face=Arial>ArcInfo 8</FONT>中全面采用这种<FONT face=Arial>COM</FONT>技术,提出了一系列基于<FONT face=Arial>COM</FONT>的新概念,如面向对象的<FONT face=Arial>GIS</FONT>等,这不仅给用户带来了机会,也给开发商带来了机会。在<FONT face=Arial>ArcInfo 8</FONT>中可以采用<FONT face=Arial>CASE</FONT>方法进行系统设计,用户面对的不再是枯燥的点、线、面,而是如真正的电力上的开关、线路,规划上的地块等。在电力应用上你可以定义一个设备组件,该设备的接口包括:开和合的状态,状态设置,匹配检查的方法。它可能只是一个接口而有的功能甚至无实现的方法,但可通过扩展后具体设备来实现。如:不管是何设备都有有电无电的状态特性,这样就可以实现线路追踪分析。检查开关的状态只要检查本身的开合就够了,而一个变压器则复杂一些,要检查变压器内的开关,可能有更复杂的设备,但其状态离不开有电无电,在外部应用中可以同等以设备这一抽象概念来对待,如有新的设备只要实现所有外部应用所要求的接口就行了,而不需要重新编译。 </P> <P ><b>何谓应用程序的定制 </b>从定义上来讲,定制就是按照一组预先确定的需求和设置来对一个对象进行创建和修改。应用程序的客户化指的就是通过修改用户界面或功能来满足用户的具体需求。而<FONT face=Arial>ArcInfo 8</FONT>的用户能够有机会在一个高度灵活和可扩展的环境中进行应用程序的定制。 <FONT face=Arial>ArcInfo 8</FONT>新的应用程序<FONT face=Arial>ArcCatalog</FONT>和<FONT face=Arial>ArcMap</FONT>是基于<FONT face=Arial>COM</FONT>的。因此,编写应用程序和解决问题的基石就是对象。任何对象要想在<FONT face=Arial>ArcInfo 8</FONT>所使用的对象模型中正确地应用就必须满足一定的条件。这些条件一旦得到满足,一个定制的工具、工具条或脚本程序就能嵌入到<FONT face=Arial>ArcMap</FONT>的应用程序框架中。 对<FONT face=Arial>ArcInfo 8</FONT>的用户来讲这意味着什么呢?这意味着在<FONT face=Arial>ArcInfo 8</FONT>中定制用户界面或扩展应用程序的功能比以往任何时候都要简单得多,灵活得多。<FONT face=Arial>ArcCatalog</FONT>和<FONT face=Arial>ArcMap </FONT>的每一个版本都内嵌一个微软公司许可授权的 <FONT face=Arial>Visual Basic for Application</FONT>(<FONT face=Arial>VBA</FONT>)。微软设计的<FONT face=Arial>VBA</FONT>为整个应用程序提供了一个无缝集成的开发环境。<FONT face=Arial>Visual Basic </FONT>是微软的一个单独的软件开发环境。<FONT face=Arial>VB</FONT>和<FONT face=Arial>VBA</FONT>都提供了许多有用的工具和一个有助于简化应用开发的完全交互的开发环境(<FONT face=Arial>IDE</FONT>)。<FONT face=Arial>VB</FONT>和<FONT face=Arial>VBA</FONT>都隐藏了<FONT face=Arial>COM</FONT>的许多复杂特性,使用户把精力集中到他们具体的工作上,而不是把珍贵的时间浪费在学习一个新的程序语言上。<FONT face=Arial>VB</FONT>由于它相对短的学习周期和强大的功能而成为目前公认的最流行的编程语言。 对开发者来说,<FONT face=Arial>VB</FONT>和<FONT face=Arial>VBA</FONT>不是唯一可选的开发工具。由于<FONT face=Arial>ArcCatalog </FONT>和<FONT face=Arial>ArcMap</FONT>是基于<FONT face=Arial>COM</FONT>的,因此支持<FONT face=Arial>COM</FONT>的任何编程语言诸如<FONT face=Arial>Visual C++</FONT>、<FONT face=Arial>Visual J++</FONT>或<FONT face=Arial>Delphi</FONT>都可以用于应用程序的开发和定制。 </P> <P ><b>选用<FONT face=Arial>VBA</FONT>还是其它支持<FONT face=Arial>COM</FONT>的语言? </b>任何一位对定制<FONT face=Arial>ArcCatalog </FONT>和<FONT face=Arial>ArcMap</FONT>感兴趣的开发人员都会在他们所使用的开发环境中作出选择。那么用产品集成的编程语言<FONT face=Arial>VBA</FONT>还是用支持<FONT face=Arial>COM</FONT>的其它语言呢?的确这两种选择都各有利弊。 使用<FONT face=Arial>VBA </FONT>进行定制<FONT face=Arial>ArcCatalog </FONT>和<FONT face=Arial>ArcMap</FONT>是一个明智的选择,因为它完全被集成在这两个应用程序中。如果使用<FONT face=Arial>VBA</FONT>就没有必要编译一个动态链接库,然后把它注册到你的系统中,然后再把它装入应用程序里作为一个定制的工具来执行。<FONT face=Arial>VBA</FONT>为你提供了一个创建客户进程的一个运行时的开发环境。 <FONT face=Arial>'declare Dim pParcelUpdate as IUpdate 'assignment/creation Set pParcelUpdate = New Parcel 'call Split on Iupdate PparcelUpdate.Split</FONT></P> <P ><FONT face=Arial>'declare Dim pParcelPay As Itax 'QI</FONT>(<FONT face=Arial>Query Interface</FONT>) <FONT face=Arial>for Itax Set pParcelPay = pParcelUpdate 'call PropertyAssessement on Itax PParcelPay.PropertyAssessement 'Release pParcelPay Set pParcelPay = Nothing </FONT></P> <P >上面代码是一个简单的<FONT face=Arial>VBA</FONT>例子,它演示了如何操作下面图表中显示的对象。 例如:如果你使用<FONT face=Arial>VBA </FONT>进行客户化,当你创建一个新的宏时,<FONT face=Arial>ArcMap</FONT>可以同时在运行。你可以在不关闭应用程序的情况下编写一个宏并且来运行它。也可以在不退出主程序的情况下对变量和运行结果进行检查。同时<FONT face=Arial>VBA</FONT>相对其它编程环境来说也是最容易掌握的一门语言。</P> <TABLE cellSpacing=0 cellPadding=0 width="100%" border=0> <TR> <TD width="100%"> <P align=center><IMG src="http://www.esrichina-bj.cn/library/chinanews/image/com-2.gif"></P></TD></TR></TABLE> <P align=left>然而,<FONT face=Arial>VBA </FONT>也有它的缺点。因为你写的脚本程序对地图文档文件来说是本地的,因此原代码就会暴露给用户。如果你想编译、加密你的程序代码,并使之不可获取,你就应该使用一种编程环境来编写<FONT face=Arial>DLL</FONT>,而不能使用<FONT face=Arial>VBA</FONT>。 那么选择其它编程语言而不选择<FONT face=Arial>VBA </FONT>的理由是什么呢?如果你已经了解并很精通某种支持<FONT face=Arial>COM</FONT>的编程语言如<FONT face=Arial>Visual C++</FONT>,那么你可以继续使用它。如果你想创建并发布一个命令工具,如一个工具条或菜单,而且不想局限于一个单文档文件的范围,并想维护你的具有版权的代码,那么你就需要创建定制的<FONT face=Arial>COM</FONT>组件。 创建定制的<FONT face=Arial>COM </FONT>命令需要一个截然不同的方法。你必须编程来管理对象的接口和实现,上面这个图表就说明了一个简单的<FONT face=Arial>COM </FONT>对象,在这个例子中,<FONT face=Arial>Parcel</FONT>是一个对象,<FONT face=Arial>Iupdate </FONT>和<FONT face=Arial>Itax</FONT>是该对象的接口。<FONT face=Arial>Iupdate </FONT>和<FONT face=Arial>Itax</FONT>具有<FONT face=Arial>Split </FONT>和<FONT face=Arial>Property Assessment</FONT>的方法。<FONT face=Arial>Parcel</FONT>继承了另外一个接口<FONT face=Arial>IZoning </FONT>的所有属性。 </P> <P ><b>如何定制<FONT face=Arial>ArcCatalog</FONT>和<FONT face=Arial>ArcMap? </FONT></b><FONT face=Arial>ArcCatalog</FONT>和<FONT face=Arial>ArcMap</FONT>可以通过几种方法来进行定制。正如前面所说的,一种方法是编写代码来扩展基本的功能。另一种是简单地从用户界面上添加或删除工具条来定制<FONT face=Arial>ArcCatalog</FONT>和<FONT face=Arial>ArcMap</FONT>。 一个工具条可以被激活或关闭,因此在用户界面上它可以显示也可以不显示。你还可以在用户界面上对工具条进行拖拉或停靠。一个不能被停靠的工具条可以浮动在桌面上,但仍然可以通过程序对它进行操作,一旦你编写了一个定制的脚本,你就可以通过拖拉的方式把它添加到工具条上。 <FONT face=Arial>ArcCatalog</FONT>和<FONT face=Arial>ArcMap</FONT>也带了一个让用户映射快捷键的界面。用户能够设置一些热键来完成诸如单击一个按扭或运行一个脚本的动作。用户定制<FONT face=Arial>ArcCatalog</FONT>和<FONT face=Arial>ArcMap</FONT>的功能的另外一种方法是直接执行一个脚本程序或宏而不是将它添加到一个命令工具里。 所作的这些改变都可以永久地保存到应用程序里。<FONT face=Arial>ArcCatalog</FONT>和<FONT face=Arial>ArcMap</FONT>带了一个模板,其工作方式与<FONT face=Arial>Microsoft Word</FONT>里的模板的工作方式相似。<FONT face=Arial>ArcMap</FONT>缺省的模板叫做<FONT face=Arial>Normal templete</FONT>文件。当<FONT face=Arial>ArcMap </FONT>启动时,应用程序创建一个缺省的文档文件。用户能够往一个文档文件里添加数据或保存<FONT face=Arial>ArcMap</FONT>的任何一个版本。用户所作的定制都保存到应用程序启动时所装入的文档文件里。这些文件在以后的<FONT face=Arial>ArcMap </FONT>操作里可被重新打开,对模板文件所作的定制也可被恢复或重新激活。 今天所能使用的诸如<FONT face=Arial>COM</FONT>这样的技术,使<FONT face=Arial>ESRI</FONT>创造出能够更好为大家服务的软件。<FONT face=Arial>ArcInfo 8</FONT>为解决<FONT face=Arial>GIS</FONT>领域里还没有解决的问题提供了一个强有力的工具,从而可以为当前的实际应用设计出更好的方案。<FONT face=Arial>ArcInfo 8</FONT>所提供的定制环境使用户能够根据现实世界设计出现实世界对象的模型,从而创建更有意义和更为有用的工具和应用程序。 利用<FONT face=Arial>COM</FONT>进行应用程序定制总的来说有以下几个步骤 <FONT face=Arial>1) </FONT>选择一种支持<FONT face=Arial>COM</FONT>编程的程序语言(<FONT face=Arial>VB</FONT>、<FONT face=Arial>VC</FONT>、<FONT face=Arial>Delphi</FONT>)编写自己的<FONT face=Arial>COM</FONT>; <FONT face=Arial>2) </FONT>编译成<FONT face=Arial>DLL</FONT>; <FONT face=Arial>3) </FONT>利用<FONT face=Arial>ArcInfo 8</FONT>的<FONT face=Arial>Categories.exe</FONT>程序来注册该<FONT face=Arial>DLL</FONT>; <FONT face=Arial>4) </FONT>在<FONT face=Arial>Arcmap</FONT>或<FONT face=Arial>ArcCatalog</FONT>中使用<FONT face=Arial>Tool->Customizer</FONT>程序的<FONT face=Arial>Add From File</FONT>功能将该<FONT face=Arial>DLL</FONT>加入<FONT face=Arial>ArcInfo 8</FONT>中; <FONT face=Arial>5) </FONT>在<FONT face=Arial>Command Tab</FONT>中,将<FONT face=Arial>Categories</FONT>列表中出现的定制命令放置在工具条上。 </P> <P ><b>在<FONT face=Arial>VB</FONT>、<FONT face=Arial>VC</FONT>中编写自己的<FONT face=Arial>COM</FONT>对象 </b><FONT face=Arial>ESRI</FONT>为<FONT face=Arial>ArcInfo 8</FONT>的开发提供了几个<FONT face=Arial>COM</FONT>对象库:<FONT face=Arial>esrimx.olb esrigx.olb</FONT>和<FONT face=Arial>esricore.olb</FONT>,在<FONT face=Arial>VBA </FONT>环境中,这几个对象库已被自动地参考,而在<FONT face=Arial>VB</FONT>、<FONT face=Arial>VC</FONT>环境中需要手工加入参考进去。 </P> <P ><b><FONT face=Arial>VB</FONT>中进行定制的步骤如下: </b><FONT face=Arial>1</FONT>)在<FONT face=Arial>reference</FONT>菜单中将需要的对象库文件参考进系统; <FONT face=Arial>2</FONT>)为需要实现的接口添加代码,要创建在<FONT face=Arial>ArcInfo 8</FONT>中使用的任何一个命令,必须实现<FONT face=Arial>Icommand</FONT>接口,如果要创建工具,还必须实现<FONT face=Arial>Itool</FONT>接口,然后对接口中的每一个属性和方法在类中都要有一个相应的实现,不管它是否需要完成; <FONT face=Arial>3</FONT>)为实现的具体功能添加代码; <FONT face=Arial>4</FONT>)编译该<FONT face=Arial>DLL</FONT>; <FONT face=Arial>5</FONT>)加入 <FONT face=Arial>ArcInfo 8 </FONT>系统中。 <FONT face=Arial>VC</FONT>中利用<FONT face=Arial>ATL</FONT>创建<FONT face=Arial>COM</FONT>的步骤如下: <FONT face=Arial>1</FONT>)使用<FONT face=Arial>New->ATL COM Wizard->Finish</FONT>; <FONT face=Arial>2</FONT>)使用<FONT face=Arial>Insert->New Class</FONT>,生成一个基于<FONT face=Arial>ATL Class </FONT>框架的组件类,并键入该类的名称; <FONT face=Arial>3</FONT>)为组件选择接口类型: <FONT face=Arial>A Dual Interface:</FONT>从<FONT face=Arial>Idispatch</FONT>继承<FONT face=Arial>COM</FONT>接口,用于<FONT face=Arial>OLE</FONT>自动化; <FONT face=Arial>B Custom Interface: </FONT>从<FONT face=Arial>Iunknown</FONT>接口继承,当不使用<FONT face=Arial>OLE</FONT>自动化时使用该接口类型; <FONT face=Arial>4</FONT>)定义接口的个数,即该<FONT face=Arial>COM</FONT>中有多少个接口; <FONT face=Arial>5</FONT>)在<FONT face=Arial>COM</FONT>的头文件中加上一行<FONT face=Arial>"#import%ARCHOME%\help\esricore.olb"</FONT>; <FONT face=Arial>6</FONT>)在接口的入映射中加入要完成的接口, 如: <FONT face=Arial>BEGIN_COM_MAP</FONT>(<FONT face=Arial>CZoomIn</FONT>) <FONT face=Arial> COM_INTERFACE_ENTRY</FONT>(<FONT face=Arial>IZoomIn</FONT>) <FONT face=Arial> COM_INTERFACE_ENTRY</FONT>(<FONT face=Arial>ICommand</FONT>) <FONT face=Arial> COM_INTERFACE_ENTRY</FONT>(<FONT face=Arial>ITool</FONT>) <FONT face=Arial>END_COM_MAP</FONT>( ) <FONT face=Arial>7</FONT>)利用该接口的标准定义为接口的每一个方法和属性添加代码,如: <FONT face=Arial>// ITool STDMETHODIMP CZoomIn::get_Cursor</FONT>(<FONT face=Arial>OLE_HANDLE * Cursor</FONT>) <FONT face=Arial>{ if </FONT>(<FONT face=Arial>Cursor == NULL</FONT>) <FONT face=Arial> return E_POINTER; if </FONT>(<FONT face=Arial>IsMouseDown</FONT>()) <FONT face=Arial> *Cursor = </FONT>(<FONT face=Arial>OLE_HANDLE</FONT>)<FONT face=Arial>m_dragCursor; else *Cursor = </FONT>(<FONT face=Arial>OLE_HANDLE</FONT>)<FONT face=Arial>m_cursor; return S_OK; } ...... </FONT></P> <P ><b>使用<FONT face=Arial>CASE </FONT>工具进行定制 </b>所谓使用<FONT face=Arial>CASE</FONT>(计算机辅助软件工程)工具,即是利用<FONT face=Arial>UML</FONT>(<FONT face=Arial>Unified Modal Language</FONT>)进行面向对象的模型设计。在这种模型的基础上,<FONT face=Arial>CASE</FONT>工具帮助创建<FONT face=Arial>COM</FONT>对象来完成定制特征的一些具体的功能以及维护这些特征属性的数据库表。 <FONT face=Arial>CASE </FONT>工具设计包含两个重要的阶段,即代码产生阶段和属性表生成阶段。前者主要创建定制特征的具体功能(属性和方法),后者用来生成<FONT face=Arial>Geodatabase</FONT>中的表。<FONT face=Arial>ArcInfo 8</FONT>的<FONT face=Arial>UML</FONT>模型由四个包组成:即<FONT face=Arial>Logicview</FONT>、<FONT face=Arial>ESRI Class</FONT>、<FONT face=Arial>ESRI interface</FONT>和<FONT face=Arial>User Features</FONT>。其中<FONT face=Arial>logicview</FONT>包处于最顶层。<FONT face=Arial>ESRI Class </FONT>包含定制特征所需要的所有的组件类,<FONT face=Arial>ESRI Interface</FONT>包含对接口的定义,这些接口由<FONT face=Arial>ESRI Class</FONT>中的类来实现。<FONT face=Arial>User Features </FONT>提供开发人员所有可创建的对象模型。 总的说来,利用<FONT face=Arial>CASE</FONT>工具进行定制可分以下几个步骤: <FONT face=Arial>* </FONT>利用<FONT face=Arial>UML</FONT>设计对象模型; <FONT face=Arial>* </FONT>将模型输出到知识库; <FONT face=Arial>* </FONT>产生描述对象的属性和方法框架代码,并为实现对象的特殊功能编写代码; <FONT face=Arial>* </FONT>为定义的对象产生<FONT face=Arial>Geodatabase</FONT>表来维护对象的属性。 </P> <P ><b><FONT face=Arial>CASE</FONT>工具应用示例: </b>这里,以一个简单的例子来说明利用<FONT face=Arial>CASE </FONT>工具进行特征定义的具体步骤。在这个例子中,我们的目标是创建<FONT face=Arial>Building</FONT>的客户特征,该特征能够在不同的比例尺下画出(<FONT face=Arial>Draw</FONT>)。 <FONT face=Arial>* </FONT>第一步:在<FONT face=Arial>Visio</FONT>建模工具中,利用<FONT face=Arial>ArcInfo 8</FONT>的<FONT face=Arial>UML</FONT>模型生成一个父类即<FONT face=Arial>Building</FONT>用来继承的类,该类由<FONT face=Arial>User Feature</FONT>来提供,如:<FONT face=Arial>Feature</FONT>; <FONT face=Arial>* </FONT>第二步:创建第二个类,命名为<FONT face=Arial>Building</FONT>,并增加新的属性“<FONT face=Arial>Owner</FONT>”,定义它的数据类型<FONT face=Arial>esriFieldTypeString</FONT>,并设为公共属性; <FONT face=Arial>* </FONT>第三步:使用同样的过程增加两个属性“<FONT face=Arial>Floors</FONT>”“<FONT face=Arial>DateBuilt</FONT>”,前者数据类型为<FONT face=Arial>esriFieldTypeInteger</FONT>,后者数据类型为<FONT face=Arial>esriFieldTypeDate</FONT>; <FONT face=Arial>* </FONT>第四步:在子类<FONT face=Arial>Building</FONT>和父类<FONT face=Arial>Feature</FONT>之间建立关系,使用继承连接符,在父类中有<FONT face=Arial>Feature::IFeatureDraw</FONT>的接口,因此对于子类<FONT face=Arial>Building</FONT>需要重载<FONT face=Arial>IfeatureDraw</FONT>的<FONT face=Arial>Draw</FONT>方法来完成我们想要的<FONT face=Arial>Building</FONT>的画出功能; <FONT face=Arial>* </FONT>第五步:将对象模型输出到知识库中,一个知识库可以包含多个对象模型,如:一个知识库中可以包含一个电力设施模型和土地利用模型; <FONT face=Arial>* </FONT>第六步:使用代码产生向导创建<FONT face=Arial>Building</FONT>组件类,代码产生向导(<FONT face=Arial>codegen.dll</FONT>)是<FONT face=Arial>DevStudio</FONT>的一个插件,这个向导使用<FONT face=Arial>ATL</FONT>来创建<FONT face=Arial>COM</FONT>对象。这个向导帮助在<FONT face=Arial>VC</FONT>环境中产生一个<FONT face=Arial>C++ COM</FONT>工程; <FONT face=Arial>* </FONT>第七步:在产生的<FONT face=Arial>COM</FONT>工程中为重载的<FONT face=Arial>Draw </FONT>方法添加代码如下: <FONT face=Arial>STDMETHODIMP Building::Draw(esriDrawPhase,drawPhase,Idisplay *pDisplay,Isymbol *pSymbol, VARIANT_BOOLSymbolInstalled,Igeometry,esriDrawStyle drawStyle</FONT>) <FONT face=Arial>{ if</FONT>(<FONT face=Arial>!SymbolInstalled</FONT>) <FONT face=Arial>pDispaly->SetSymbol</FONT>(<FONT face=Arial>pSymbol</FONT>)<FONT face=Arial>; IDisplayTransformation</FONT>(<FONT face=Arial>;ipTrans</FONT>)<FONT face=Arial>; IFeature->get_DisplayTransformation</FONT>(<FONT face=Arial>;ipTrans</FONT>)<FONT face=Arial>; IfeaturePtr ipFeature</FONT>(<FONT face=Arial>GetControlingUnknown</FONT>( ))<FONT face=Arial>; IgeometryPtr ipGeom; IpFeature->get_Shape</FONT>(<FONT face=Arial>;ipGeom</FONT>)<FONT face=Arial>; If </FONT>(<FONT face=Arial>ipGeom == 0</FONT>) <FONT face=Arial>return S_OK; Double scale; IpTrans->get_Scale</FONT>(<FONT face=Arial>;scale</FONT>)<FONT face=Arial>; If </FONT>(<FONT face=Arial>scale > 6000</FONT>) <FONT face=Arial> { IcolorPtr ipColor; </FONT>((<FONT face=Arial>IfillSymbolPtr</FONT>)<FONT face=Arial>pSymbol</FONT>)<FONT face=Arial>->get_Color</FONT>(<FONT face=Arial>;ipColor</FONT>)<FONT face=Arial>; IsimpleMarkerSymbolPtr ipSym</FONT>(<FONT face=Arial>__uuidof</FONT>(<FONT face=Arial>SimpleMarkerSymbol</FONT>))<FONT face=Arial>; PDisplay->SetSymbol</FONT>(<FONT face=Arial>IsymbolPtr</FONT>(<FONT face=Arial>ipSym</FONT>))<FONT face=Arial>; IenvelopePtr ipEnv; IpGeom->GetEnvelop</FONT>(<FONT face=Arial>;ipEnv</FONT>)<FONT face=Arial>; IpointPtr ipPoint; </FONT>((<FONT face=Arial>IareaPtr</FONT>)<FONT face=Arial>ipEnv</FONT>)<FONT face=Arial>->get_Centroid</FONT>(<FONT face=Arial>;ipPoint</FONT>)<FONT face=Arial>; pDisplay->DrawPoint</FONT>(<FONT face=Arial>ipPoint</FONT>)<FONT face=Arial>; } else if </FONT>(<FONT face=Arial>scale > 3000</FONT>) <FONT face=Arial> { IenvlopPtr ipEnv; IpGeom->get_Envlope</FONT>(<FONT face=Arial>;ipEnv</FONT>)<FONT face=Arial>; PDisplay->DrawRectangle</FONT>(<FONT face=Arial>ipEnv</FONT>)<FONT face=Arial>; } else { pDisplay->DrawPolygon</FONT>(<FONT face=Arial>IpolygonPtr</FONT>(<FONT face=Arial>ipGeom</FONT>))<FONT face=Arial>; } return S_OK; } </FONT>编译该工程,并生成<FONT face=Arial>Building.dll * </FONT>第八步:在<FONT face=Arial>ArcCatalog</FONT>中利用表创建向导为定制的特征组件在<FONT face=Arial>Geodatebase</FONT>中产生属性表,当初你为<FONT face=Arial>Building</FONT>创建的所有属性(<FONT face=Arial>Owner</FONT>、<FONT face=Arial>Floors</FONT>、<FONT face=Arial>DateBuilt</FONT>)在该属性表中都被影射为一个字段或列。具体步骤为: 连接存储有定制对象的数据库; 选取定制对象的 数据模型; 选取要生成属性表的定制特征; 定制各个属性列。 <FONT face=Arial>* </FONT>第九步:在<FONT face=Arial>ArcMap</FONT>中使用该对象。 </P> <P ><b>如何进一步学习<FONT face=Arial>COM </FONT>和<FONT face=Arial>VBA</FONT>? </b>定制<FONT face=Arial>ArcCatalog</FONT>和<FONT face=Arial>ArcMap</FONT>是完全基于<FONT face=Arial>COM</FONT>的应用。如果你对进一步了解和学习<FONT face=Arial>COM </FONT>和<FONT face=Arial>VBA</FONT>感兴趣,这里有一些可以帮助你的书籍: <FONT face=Arial>1</FONT>、《<FONT face=Arial>COM</FONT>技术内幕》,杨秀章译,清华大学出版社,<FONT face=Arial>1999</FONT>年 <FONT face=Arial>2</FONT>、《<FONT face=Arial>COM/DCOM</FONT>编程指南》,刘云、孔雷译,清华大学出版社,<FONT face=Arial>2000</FONT>年 <FONT face=Arial>3</FONT>、《<FONT face=Arial>ActiveX</FONT>开发人员指南》,章巍 等译,机械工业出版社,<FONT face=Arial>1997</FONT>年 <FONT face=Arial>3</FONT>、<FONT face=Arial>Chappel, D. Understanding ActiveX and OLE. Redmond, Washington. Microsoft Press; 1996. 4</FONT>、<FONT face=Arial>Getz, K. and Gilbert M.VBA Develop's Handbook. Alameda, California. Sybex Inc., 1997</FONT></P> |
|