你好,欢迎来到电脑编程技巧与维护杂志社! 杂志社简介广告服务读者反馈编程社区  
合订本订阅
 
 
您的位置:杂志经典 / 图形图象处理与游戏编程
5.18 应用COM技术扩展ArcGIS的功能(下)
 

   frmQueryAttribe.lblInfo.Caption = ""

  End If

End Sub

Private Sub ITool_OnMouseMove(ByVal button As Long, ByVal shift As Long, ByVal X As Long, ByVal Y As Long)

End Sub

Private Sub ITool_OnMouseUp(ByVal button As Long, ByVal shift As Long, ByVal X As Long, ByVal Y As Long)

End Sub

Private Sub ITool_Refresh(ByVal hdc As esriSystem.OLE_HANDLE)

End Sub

工具条实现ItoolBarDef接口的核心代码如下:

'类模块:ToolBarForDLG

Option Explicit

Implements IToolBarDef

Private Property Get IToolBarDef_Caption() As String

    IToolBarDef_Caption = "DLG工具条 刘新定2007.7.3"

End Property

Private Sub IToolBarDef_GetItemInfo(ByVal pos As Long, ByVal itemDef As esriSystemUI.IItemDef)

    Select Case pos

        Case 0

            itemDef.ID = "LxdArcMap.cmdOpenCoverage"

        Case 1

            itemDef.ID = "LxdArcMap.toolQueryAttribe"

        Case 2

            itemDef.Group = True

            itemDef.ID = "LxdArcMap.cmdDockWinTest"

   End Select

End Sub

Private Property Get IToolBarDef_ItemCount() As Long

    IToolBarDef_ItemCount = 3

End Property

Private Property Get IToolBarDef_Name() As String

    IToolBarDef_Name = "DLG工具条"

End Property

菜单实现IMenuDef IRootLevelMenu两个接口的核心代码如下:

'类模块:MenuForDLG.cls

Option Explicit

Implements IMenuDef

Implements IRootLevelMenu

Private Property Get IMenuDef_Caption() As String

    IMenuDef_Caption = "DLG菜单"

End Property

Private Sub IMenuDef_GetItemInfo(ByVal pos As Long, ByVal itemDef As esriSystemUI.IItemDef)

    Select Case pos

        Case 0

            itemDef.ID = "LxdArcMap.cmdOpenCoverage"

        Case 1

            itemDef.Group = True

            itemDef.ID = "LxdArcMap.cmdDockWinTest"

        Case 2

            itemDef.Group = True

            itemDef.ID = "LxdArcMap.cmdAbout"

    End Select

End Sub

Private Property Get IMenuDef_ItemCount() As Long

    IMenuDef_ItemCount = 3

End Property

Private Property Get IMenuDef_Name() As String

    IMenuDef_Name = "DLG菜单"

End Property

泊钨窗实现IDockableWindowDef 接口,代码如下:

'类模块:dockwinTest.cls

Option Explicit

Implements IDockableWindowDef

Dim WithEvents mDoc As MxDocument '定义一个带事件的文档变量以接收文档改变事件

Private winDock As frmDockWinTest

Private Sub Class_Initialize()

    Set winDock = New frmDockWinTest '建立新的窗口表单

End Sub

Private Sub Class_Terminate()

    Set winDock = Nothing

End Sub

Private Property Get IDockableWindowDef_Caption() As String

    IDockableWindowDef_Caption = "泊钨窗测试 刘新定2007.7.4"

End Property

Private Property Get IDockableWindowDef_ChildHWND() As esriSystem.OLE_HANDLE

    IDockableWindowDef_ChildHWND = winDock.图形容器.hwnd 'frmDockWinTest.图形容器.hwnd

End Property

Private Property Get IDockableWindowDef_Name() As String

    IDockableWindowDef_Name = "泊钨窗测试"

End Property

Private Sub IDockableWindowDef_OnCreate(ByVal hook As Object)

    Set m_pArcMapApp = hook '获得Arcmapapplication实例指针,将其保存到全局变量中

    Set mDoc = m_pArcMapApp.Document '保存文档对象

    Dim pDoc As IMxDocument

    Set pDoc = m_pArcMapApp.Document

    Set winDock.TheActiveView = pDoc.FocusMap '设置泊坞窗保存当前视图指针

End Sub

Private Sub IDockableWindowDef_OnDestroy()

    'MsgBox "Destroy 泊钨窗"

    Unload winDock

End Sub

Private Property Get IDockableWindowDef_UserData() As Variant

End Property

'视图改变时重设表单中的m_pActiveView指针,以使地图控件与当前地图同步

Private Function mDoc_ActiveViewChanged() As Boolean

    Dim pDoc As IMxDocument

    Set pDoc = m_pArcMapApp.Document

    Set winDock.TheActiveView = pDoc.FocusMap

    winDock.InitLayer '初始化:地图控制加入图层

End Function

'关闭文档时

Private Function mDoc_CloseDocument() As Boolean

    Dim pDoc As IMxDocument

    Set pDoc = m_pArcMapApp.Document

    Set winDock.TheActiveView = Nothing

End Function

'地图改变时重设表单中的m_pActiveView指针,以使地图控件与当前地图同步

Private Function mDoc_MapsChanged() As Boolean

    Dim pDoc As IMxDocument

    Set pDoc = m_pArcMapApp.Document

    Set winDock.TheActiveView = pDoc.FocusMap

    winDock.InitLayer '初始化:地图控制加入图层

End Function

'新建文档时重设表单中的m_pActiveView指针,以使地图控件与当前地图同步

Private Function mDoc_NewDocument() As Boolean

    Dim pDoc As IMxDocument

    Set pDoc = m_pArcMapApp.Document

    Set winDock.TheActiveView = pDoc.FocusMap

End Function

'打开文档时重设表单中的m_pActiveView指针,以使地图控件与当前地图同步

Private Function mDoc_OpenDocument() As Boolean

    Dim pDoc As IMxDocument

    Set pDoc = m_pArcMapApp.Document

    Set winDock.TheActiveView = pDoc.FocusMap

    winDock.InitLayer '初始化:地图控制加入图层

End Function

其他窗体模块的实现代码在这不再列表。对于以上接口的实现而言,最重要的是OnCreate事件,当应用创建COM对象时,会将一个应用本身的指针传递给COM对象,COM对象可以保存些指针,在以后的动作中使用,从而达到了在应用与COM对象之间互相通信的目的。故在一个全局模块中定义如下变量:

Public m_pArcMapApp As IApplication '全局应用指针,在自定义UI类的OnCreate中进行保存。

最后,编译生成DLL文件。

2.安装服务器组件

首先,启动ArcMap,选中菜单[Tools]中的[Customize]项,显示如图2所示的对话框。


 

图2 选项设置

然后,点选按钮[Add from file],浏览到我们编写的ActiveX DLL文件,ArcMap会提示在我们编写的组件库中找到如图3组件。


图3 显示组件

[OK]确认。工具条和菜单及工具按钮等会出现在对话框中。选中自定义的工具条,则该工具条在ArcMap的窗口中出现。该工具条可以悬浮,也可以组合到其他工具条中。点选Commands面板,可以看到我们创建的工具按钮和交互工具:点中Commands面板中的[DLG菜单]将其拖到菜单区中,它将成为ArcMap的一个菜单。现在可以开始使用我们扩充的功能了。

由上面步骤可见,在修改定制时,ArcMap会自动对组件进行注册,下次启动ArcMap时,我们扩充的工具条和菜单会被自动调用。一个例外:其中鹰视泊钨窗需进行Dockable Windows种类注册,方可显示,注册界面如图4所示。


图4 注册界面

完整的运行界面如下图5所示。


图5 程序运行效果

测试环境:Windows XP 中文版 +  Visual Basic 6.0 中文版 +  ArcGIS9.2,通过测试。

四、结语

COM是一个功能十分强大同时也十分复杂的体制,它在很大程度上满足了软件开发人员以“搭积木”的形式构建软件系统的理想,为软件重用和功能扩充提供了很好的途径。COM主要用于微软的平台,而且也不是一项新技术,但对于微软不断推出的DCOMCOM+.NET技术而言,COM可以说是它们的奠基石。与COM并行的技术还有CORBAEJB,它们是由Sun提出来的,适用的操作系统平台更广,但可以用于开发的语言则有限,EJB主要用Java开发,而CORBA可以用Delphi等来开发

 

  推荐精品文章

·2024年12月目录 
·2024年11月目录 
·2024年10月目录 
·2024年9月目录 
·2024年8月目录 
·2024年7月目录 
·2024年6月目录 
·2024年5月目录 
·2024年4月目录 
·2024年3月目录 
·2024年2月目录 
·2024年1月目录
·2023年12月目录
·2023年11月目录

  联系方式
TEL:010-82561037
Fax: 010-82561614
QQ: 100164630
Mail:gaojian@comprg.com.cn

  友情链接
 
Copyright 2001-2010, www.comprg.com.cn, All Rights Reserved
京ICP备14022230号-1,电话/传真:010-82561037 82561614 ,Mail:gaojian@comprg.com.cn
地址:北京市海淀区远大路20号宝蓝大厦E座704,邮编:100089