zoukankan      html  css  js  c++  java
  • 使用动态链接库组件进行ArcGIS开发

          动态链接库英文为DLL,是Dynamic Link Library 的缩写形式,DLL不是可执行文件,DLL 是一个包含可由多个程序同时使用的代码和数据的库。

          通过使用 DLL,程序可以实现模块化,由相对独立的组件组成。例如,一个计帐程序可以按模块来销售。可以在运行时将各个模块加载到主程序中(如果安装了相应模块)。因为模块是彼此独立的,所以程序的加载速度更快,而且模块只在相应的功能被请求时才加载。此外,可以更为容易地将更新应用于各个模块,而不会影响该程序的其他部分。例如,您具有一个建筑工程造价计算程序,而不同区域的建筑材料其价格不尽相同,而且随着时间的变化,建筑材料的价格也随着经济的发展而发生着变化,当这些变化被隔离到 DLL 中以后,您无需重新生成或安装整个程序就可以应用更新。

          DLL的优点:

    1. 扩展了应用程序的特性;
    2. 可以用许多种编程语言来编写;
    3. 简化了软件项目的管理;
    4. 有助于节省内存;
    5. 有助于资源共享;
    6. 有助于应用程序的本地化;
    7. 有助于解决平台差异;
    8. 可以用于一些特殊的目的。windows使得某些特性只能为DLL所用。

          DLL其实就是Windows平台下的一种类的文件编译格式,该格式的文件可以被任何支持COM规则的语言所支持和引用。ArcGIS Object组件本身的物理文件就是DLL文件,开发人员也可以编写自己的DLL组件进行二次开发。

          下面以一个实例来演示如何在Visual Basic环境下创建DLL组件。

          启动Visual Basic,建立一个ActiveX dll工程。如下图所示:

      

          为工程添加引用,Projects>References打开References对话框,在对话框中选择ESRI System Object Library、ESRI SystemUI Object Library、ESRI Framework Object Library和ESRI ArcMapUI Object Library四个对象库。如下图所示:

        

          添加名为Form的窗体,向窗体中添加名为Picture1的图片框,设置Picture1的Picture属性,为其指定一个bmp格式的图标。

          下面可以开始编码了。打开Class1类模块文件,在开头加入如下代码:

          Option Explicit

          Implements ICommand
          Dim pApp As IApplication

          在General下拉框中选择ICommand接口,在Declarations下拉框中选择Bitmap,带自动出现的代码段中添加ICommand_Bitmap = Form1.Picture1.Picture.Handle来实现实现ICommand接口的BitMap属性。使用同样的步骤实现IComand接口的Caption、Category、Checked、Enabled、HelpContextID、HelpFile、Message、Name、ToolTip属性和OnClick与OnCreat方法。完整代码如下:

    代码
    Option Explicit
    Implements ICommand
    Dim pApp As IApplication

    Private Property Get ICommand_Bitmap() As esriSystem.OLE_HANDLE
    ICommand_Bitmap
    = Form1.Picture1.Picture.Handle
    End Property

    Private Property Get ICommand_Caption() As String
    ICommand_Caption
    = "HSCommand"
    End Property

    Private Property Get ICommand_Category() As String
    ICommand_Category
    = "HSCustomTools"
    End Property

    Private Property Get ICommand_Checked() As Boolean

    End Property

    Private Property Get ICommand_Enabled() As Boolean
    Dim pMxDoc As IMxDocument
    Dim pLayerCount As Integer
    Set pMxDoc
    = pApp.Document
    pLayerCount
    = pMxDoc.FocusMap.LayerCount
    If pLayerCount
    > 0 Then
    ICommand_Enabled
    = True
    Else
    ICommand_Enabled
    = False
    End If
    End Property

    Private Property Get ICommand_HelpContextID() As Long
    ICommand_HelpContextID
    = 1234
    End Property

    Private Property Get ICommand_HelpFile() As String

    End Property

    Private Property Get ICommand_Message() As String
    ICommand_Message
    = "This is my custom command"
    End Property

    Private Property Get ICommand_Name() As String
    ICommand_Name
    = "HSCustomTool_MyCommand"
    End Property

    Private Sub ICommand_OnClick()
    MsgBox
    "Clicked on my command"
    End Sub

    Private Sub ICommand_OnCreate(ByVal hook As Object)
    pApp
    = hook
    End Sub

    Private Property Get ICommand_Tooltip() As String
    ICommand_Tooltip
    = "HSCommand"
    End Property

          编译该工程,以建立dll文件。至此,该动态链接库就建立好了。

          下面在ArcMap中使用刚建立的基于ICommad接口的自定义命令。启动ArcMap,Tools>Customize,弹出Customize对话框,切换到Toolbars选项卡,新建一个Toolbar。如下图所示:

     

          切换到Commands选项卡,单击Add from file 按钮,导航至刚才建立的dll文件,这个自定义的命令就添加至ArcMap中了。在Categories列表框中找到HSCustomTools,在Commands列表框中找到HSCommand,将其拖拽至刚建立的自定义工具栏上。

        OK,向ArcMap中添加数据,测试一下自定义命令吧! ^_^ 效果如下:

      

        本文重点在于对“使用动态链接库组件进行ArcGIS开发”这一开发方式进行介绍性演示,在开发DLL组件功能上没有深入探究。可根据实际需要扩展DLL功能。

  • 相关阅读:
    vue主动刷新页面及列表数据删除后的刷新实例
    一些VUE技巧收藏
    d2-admin中不错的技巧
    webSocket另一种封装
    基于token前后端分离认证
    node.js使用vue-native-websocket实现websocket通信 实测有效
    Vue 路由传递参数
    ES6中import {} 的括号
    Vue 参数传递
    简单工厂模式
  • 原文地址:https://www.cnblogs.com/hans_gis/p/1887678.html
Copyright © 2011-2022 走看看