Vb

  • November 2019
  • PDF

This document was uploaded by user and they confirmed that they have the permission to share it. If you are author or own the copyright of this book, please report to us by using this DMCA report form. Report DMCA


Overview

Download & View Vb as PDF for free.

More details

  • Words: 942
  • Pages: 14
如何在 VB.NET IDE 环境下开发 ArcMap 定制组件 (JUST FOR BEGINNERS)

1 准备:  

安装 Vs.net 2003。 安装 ArcGis Desktop 9 (第一张安装盘) 及 ArcGis DevKit (第二张安装盘) 并 选中 dot.net 支持选项。

2 实例演示: 下面以一实例来简介在 VB.net IDE 环境下开发 ArcMap 定制 Com 组件的基本流程。组 件功能:放大视图一倍。

2.1 创建一个新的类库 1) 2) 3) 4)

打开 Visual Studio .NET; 在 vs.net 环境中,点击菜单:文件->新建->项目; 在新建项目对话框中,在左侧项目类型面板中选择 Visual Basic 项目; 在右侧的模板面板中选择类库;

5) 6)

命名项目为 VBNetCmds,并且选择项目存储的路径; 点击确定,这样就新建了一个项目。

[图一]

2.2 引用 ESRI 对象库 在正常使用 ESRI 提供的 dotnet 对象库之前,你必须将必须的 ESRI 对象库引用到当前 项目中。ESRI 对象库在安装 Devkit 开发包时被安装,默认的安装路径为:ArcGIS 安 装根目录\DotNet 。

1)

2)

[图二] 点击项目菜单,然后点击添加引用子菜单,添加引用对话框打开后,选择.net 标签,依 次 选 择 ESRI.ArcGIS.Geometry, ESRI.ArcGIS.SystemUI , ESRI.ArcGIS.Framework , ESRI.ArcGIS.Carto 四个 ESRI 对象库,在本项目中还会用到其它几个对象库,如 System.Drawing 等,这时可以同时选择。 点击确定,关闭添加引用对话框,同时完成必需引用的添加。

说明: ESRI.ArcGIS.Geometry 引用是因为在后面的代码中会使用到 Iextent ,Ipoint 等接口; ESRI.ArcGIS.SystemUI 引用是因为要用来 Icommand 等接口; ESRI.ArcGIS.Carto ESRI.ArcGIS.Framework

2.3 创建一个放大命令 可以使用 Com 类向导向项目中添加一个新类。 1) 在解决方案资源管理器中,右击项目,点击添加,然后选择添加新项; 2) 在添加新项对话框中,在右侧面板选择 Com 类,在对话框底部的名称文本框中输入此 Com 类的名称,本例中为 NetZoomIn.Vb。

3)

[图三] 在解决方案资源管理器中,右键点击已存在的类(Class1.VB),然后点击删除,将项目 创建时自动创建的类删除。

[图四]

2.4 添加 Imports 部份: 添加 Imports 表达式,可以简化代码的编写,使代码具有更好的可读性。 1) 在解决方案资源管理器中,双击 NETZoomIn.VB,打开它的代码编辑窗口。 2) 在代码窗口的顶部,类声明的起始部份添加如下的代码; Imports ESRI.ArcGIS.SystemUI

'定义Icommand、ITool等接口

Imports ESRI.ArcGIS.ArcMapUI

'定义ImxApplication、IDataWindow等接口

Imports ESRI.ArcGIS.Geometry

'定义IGeometry、IPoint等接口

Imports ESRI.ArcGIS.Framework

'定义IcommandBar、IDocument、IdockbleWindow等接口

Imports ESRI.ArcGIS.Carto

'定义IFeatureLayer、ICADLayer 等接口

Imports System.Drawing

'命令使用的图标位图IBitmap接口等

Imports System.Runtime.InteropServices

'

2.5 实现 Icommand 接口: 1)

在 NetZoomIn.VB 代码窗口,可以使用如下代码声明 NetZoomIn 类实现 Icommand 接口: Public Class NetZoomIn Implements ICommand

2)

在 NetZoomIn 类代码窗口顶部的向导栏,点击左侧的下接列表,并选中 Icommand;

3)

[图五] 在右侧的下接列表中,选择 Icommand 接口的第一个成员 Bitmap,Bitmap 属性的

4) 5)

代码框架将被添加到代码窗口中; 重复 2)-3)步,将所有 Icommand 接口的成员代码框架添加到代码窗口中; 点击 Ctrl+Shift+S ,保存项目中所有的文件。

[图六]

2.6 添加 Icommand 接口成员代码: 现在开始向 Icommand 接口的成员中添加代码。 1) 向类中添加如下所示的代码段,下面的变量成员将被 Icommand 接口所使用。 Public Class NetZoomIn Implements ICommand

Private m_app As IApplication

'ArcMap应用程序接口

Private m_enabled As Boolean

'此命令是否有效

Private m_bitmap As Bitmap

'此命令显示于工具栏上的位图

Private m_hBitmap As IntPtr

'位图指针

#Region "COM GUIDs"

成员变量在类定义的开始部份进行声明。 2)

在 NetZoomIn 代码窗口,卷动并找到 OnCreate 方法,添加如下代码到该方法:

Public Sub OnCreate(ByVal hook As Object) Implements ESRI.ArcGIS.SystemUI.ICommand.OnCreate '该类创建时实现的功能,引用ArcMap应用程序,并使用该命令处于有效状态 If Not (hook Is Nothing) Then If TypeOf (hook) Is IMxApplication Then m_app = CType(hook, IApplication) m_enabled = True End If End If End Sub

3)

向上卷动代码窗口,找到 OnClick 方法,添加如下代码以完成当前活动视图的放 大动作:

Public Sub OnClick() Implements ESRI.ArcGIS.SystemUI.ICommand.OnClick '鼠标点击该命令按钮时,实现的功能

Dim mxDoc As IMxDocument = CType(m_app.Document, IMxDocument) Dim activeView As IActiveView = mxDoc.ActiveView Dim currExtent As IEnvelope = activeView.Extent currExtent.Expand(0.5D, 0.5D, True) activeView.Extent = currExtent activeView.Refresh() End Sub

4)

编 辑 代 码 块 , 以 实 现 Category , Caption , Checked , Enabled , Helpfile , HelpContextID , Name , Message , 以及 Tooltip 等方法,实现该命令的一些 返回信息。

Public ReadOnly Property Caption() As String Implements ICommand.Caption Get Return "放大工具" End Get End Property

Public ReadOnly Property Category() As String Implements ICommand.Category Get Return "NetCmds" End Get End Property

Public ReadOnly Property Checked() As Boolean Implements ICommand.Checked Get Return False End Get End Property

Public ReadOnly Property Enabled() As Boolean Implements ICommand.Enabled Get Return m_enabled End Get End Property

Public ReadOnly Property HelpContextID() As Integer Implements ICommand.HelpContextID Get Return 0 End Get End Property

Public ReadOnly Property HelpFile() As String Implements ICommand.HelpFile Get

End Get

End Property

Public ReadOnly Property Message() As String Implements ICommand.Message Get Return "当前视图放大一倍显示." End Get End Property

Public ReadOnly Property Name() As String Implements ICommand.Name Get Return "NetCmds_放大工具"

End Get End Property

Public ReadOnly Property Tooltip() As String Implements ICommand.Tooltip Get Return "放大一倍" End Get End Property

2.7 完成工具的图标部份(Icommand::Bitmap) 现在需要添加一个已存在的位置文件到当前项目中,做为本命令按扭显示的图标,这里 要添加对 System.Drawing 库的引用。 1) 在解决方案资源管理器窗口,右击 VBNetCmds 项目,然后点击添加,并选择添加 现有项;([图七]) 2) 在添加现有项对话框中,在文件类型部份的下接列表中选择图像文件,并定位到要 添加的位置文件(本例中为 ZoomIn.BMP) ,点击打开按钮,将该位图添加到项目 中。([图八]) 3) 4)

在解决方案资源管理器窗口中,选择刚刚添加的 ZoomIn.BMP 项目,在下面的属 性窗口中的生成操作条目的下接列表中选择嵌入的资源选项。 ([图九]) 返回到该命令的代码窗口,添加如下的代码到类构结构中:

Public Sub New() MyBase.New() Dim res() As String = GetType(NetZoomIn).Assembly.GetManifestResourceNames() If (res.GetLength(0) > 0) Then m_bitmap = New _ Bitmap(GetType(NetZoomIn).Assembly.GetManifestResourceStream(res(0))) If Not (m_bitmap Is Nothing) Then m_bitmap.MakeTransparent(m_bitmap.GetPixel(1, 1)) m_hBitmap = m_bitmap.GetHbitmap() End If End If

End Sub

[图七]

[图八]

[图九] 注意:GetHbitmap 方法不受控的 Windows GDI 位图对象,这个对象必须使用特定的 方法进行删除,因为 .net 垃圾收集器不能清除不受控的资源。可以在如下的两个步骤 5) 及 6) 中完成删除操作。 5) 向上卷动代码窗口,在类声明内部添加如下代码: Public Class NetZoomIn Implements ICommand

_ Private Shared Function DeleteObject(ByVal hObject As IntPtr) As Boolean End Function

DllImport 表达式部份提供了对 GDI32.DLL 库中的 DeleteObject 函数的访问声明。 6) 向下卷动代码窗口,在类结构的底部添加如下代码: Protected Overrides Sub Finalize() If (m_hBitmap.ToInt32() <> 0) Then DeleteObject(m_hBitmap) End If End Sub

以 上 这 段 代 码 在 垃 圾 收集 器 需 要 消 毁 NetZoomIn 类 实 例 时 被 调 用, 它重 载了 System.Object. Finalize 方法。

7)

最后添加如下代码到 Icommand::Bitmap 方法中,并返回 Bitmap 名柄。

Public ReadOnly Property Bitmap() As Integer Implements ICommand.Bitmap Get Return m_hBitmap.ToInt32() End Get End Property

2.8 声明你的类为 Com ArcGIS 要求你的命令类为 COM 类,因此你创建的类必须声明为 COM,可以为它创建 一个可调用的 Com 封装。 如果你在项目开始时,使用 COM 类向导来创建你的类,那么 VB.NET 将会自动的做这 些事情,而不用你在后期手动添加。

2.9 添加 Com 分类 注册函数 这个工作可以借助 Addins For .net 工具来完成,也可以手工方式添加代码。本示例实现 的 为 IMxCommands 小 类 的 注 册 , IMxCommands 的 注 册 表 标 识 GUID 值 为 : {B56A7C42-83D4-11D2-A2E9-080009B6F22B} 。 手工方式添加: 将如下所示代码添加到代码窗口类声明顶部,Com Guids Region 底部: #Region "Component Category Registration"

_ Public Shared Sub RegisterFunction(ByVal sKey As String) Dim fullKey As String = sKey.Remove(0, 18) & "\Implemented Categories" Dim regKey As Microsoft.Win32.RegistryKey = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(fullKey, True) If Not (regKey Is Nothing) Then regKey.CreateSubKey("{B56A7C42-83D4-11D2-A2E9-080009B6F22B}") End If End Sub

_ Public Shared Sub UnregisterFunction(ByVal sKey As String) Dim fullKey As String = sKey.Remove(0, 18) & "\Implemented Categories" Dim regKey As Microsoft.Win32.RegistryKey = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(fullKey, True) If Not (regKey Is Nothing) Then regKey.DeleteSubKey("{B56A7C42-83D4-11D2-A2E9-080009B6F22B}") End If End Sub

#End Region

通过 Devkit Addin for .net 工具自动生成: 在 VS.NET IDE 环境中,在主菜单中选择 工具-> ESRI ComponentCategoryRegistar , 打开 Component Category Registering 对话框,在下面的列表中选择 MxCommands ,使其 前面的复选框处于选中状态,然后点击 OK 按钮,如下代码会自动添加到代码窗口中:

[图十]

[图十一] #Region "Component Category Registration" _ Public Shared Sub Reg(ByVal regKey As String) MxCommands.Register(regKey) End Sub

_ Public Shared Sub Unreg(ByVal regKey As String) MxCommands.Unregister(regKey) End Sub

#End Region

这段代码与上面手工添加的代码功能是一样的。但使用这个 Addin 工具在工程的 BIN 目录中会生成两个批处理文件:Reg.Bat 及 UnReg.Bat ,用于手工注册或手工取消注册生 成的 DLL 文件。

[图十二] Reg.Bat 文件内容为: regasm VBNetCmds.dll 请将内容改为: regasm VBNetCmds.dll /tlb: VBNetCmds.tlb /codebase Unreg.Bat 文件内容为: regasm VBNetCmds.dll /u regasm 为.net framework 提供的.net com 组件注册工具,位于 SYSTEMROOT:\WINDOWS\Microsoft.NET\Framework\v1.1.4322 目录中。请在 Path 路 径设置中加入该路径。

2.10 编译项目: 在进行项目编译之前, 使用 Ctrl+Shift+S 保存项目文件所做的修改,然后在 VS.NET IDE 环境中,运行 Ctrl+Shift+B 快捷键编译项目,或通过 菜单项 生成 -> 生成解决方案来完 成。

[图十三]

如果编译成功,在结果窗口会显示以下类似信息:

[图十四] 否则,如果编译不通过,代码中有拼写错误或其它错误时,将会显示类似如下的信息:

[图十五] 双击出错项目描述部份,将直接来到错误出处,改正所有错误,直到出现生成成功为 止。

2.11 在 ArcMap 环境中使用 1) 2)

3)

打开 ArcMap,点击菜单 Tools->Customize…,打开自定义对话框(图十六): 在打开的 Customize 对话框中,点击 Commands 标签,在左侧的 Categories 列表 中找到 NetCmds 分类,这时,我们刚刚做好的工具放大工具将会显示在右侧的 Commands 列表中(图十七)。 拖动放大工具到指定的工具栏上(图十八) ,点击 Close 按钮,关闭 Customize 对 话框。现在可以使用我们刚做的放大工具了。

[图十六]

[图十七]

[图十八]

Related Documents

Vb
November 2019 60
Vb
November 2019 53
Vb
November 2019 51
Vb
November 2019 46
Vb
November 2019 34
Vb
December 2019 35