您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 公司方案 > 如何在VB.NETIDE环境下开发ArcMap定制组件(PDF14)(1)
如何在VB.NETIDE环境下开发ArcMap定制组件(JUSTFORBEGINNERS)1准备:安装Vs.net2003。安装ArcGisDesktop9(第一张安装盘)及ArcGisDevKit(第二张安装盘)并选中dot.net支持选项。2实例演示:下面以一实例来简介在VB.netIDE环境下开发ArcMap定制Com组件的基本流程。组件功能:放大视图一倍。2.1创建一个新的类库1)打开VisualStudio.NET;2)在vs.net环境中,点击菜单:文件-新建-项目;3)在新建项目对话框中,在左侧项目类型面板中选择VisualBasic项目;4)在右侧的模板面板中选择类库;5)命名项目为VBNetCmds,并且选择项目存储的路径;6)点击确定,这样就新建了一个项目。[图一]2.2引用ESRI对象库在正常使用ESRI提供的dotnet对象库之前,你必须将必须的ESRI对象库引用到当前项目中。ESRI对象库在安装Devkit开发包时被安装,默认的安装路径为:ArcGIS安装根目录\DotNet。[图二]1)点击项目菜单,然后点击添加引用子菜单,添加引用对话框打开后,选择.net标签,依次选择ESRI.ArcGIS.Geometry,ESRI.ArcGIS.SystemUI,ESRI.ArcGIS.Framework,ESRI.ArcGIS.Carto四个ESRI对象库,在本项目中还会用到其它几个对象库,如System.Drawing等,这时可以同时选择。2)点击确定,关闭添加引用对话框,同时完成必需引用的添加。说明:ESRI.ArcGIS.Geometry引用是因为在后面的代码中会使用到Iextent,Ipoint等接口;ESRI.ArcGIS.SystemUI引用是因为要用来Icommand等接口;ESRI.ArcGIS.CartoESRI.ArcGIS.Framework2.3创建一个放大命令可以使用Com类向导向项目中添加一个新类。1)在解决方案资源管理器中,右击项目,点击添加,然后选择添加新项;2)在添加新项对话框中,在右侧面板选择Com类,在对话框底部的名称文本框中输入此Com类的名称,本例中为NetZoomIn.Vb。[图三]3)在解决方案资源管理器中,右键点击已存在的类(Class1.VB),然后点击删除,将项目创建时自动创建的类删除。[图四]2.4添加Imports部份:添加Imports表达式,可以简化代码的编写,使代码具有更好的可读性。1)在解决方案资源管理器中,双击NETZoomIn.VB,打开它的代码编辑窗口。2)在代码窗口的顶部,类声明的起始部份添加如下的代码;ImportsESRI.ArcGIS.SystemUI'定义Icommand、ITool等接口ImportsESRI.ArcGIS.ArcMapUI'定义ImxApplication、IDataWindow等接口ImportsESRI.ArcGIS.Geometry'定义IGeometry、IPoint等接口ImportsESRI.ArcGIS.Framework'定义IcommandBar、IDocument、IdockbleWindow等接口ImportsESRI.ArcGIS.Carto'定义IFeatureLayer、ICADLayer等接口ImportsSystem.Drawing'命令使用的图标位图IBitmap接口等ImportsSystem.Runtime.InteropServices'2.5实现Icommand接口:1)在NetZoomIn.VB代码窗口,可以使用如下代码声明NetZoomIn类实现Icommand接口:PublicClassNetZoomInImplementsICommand2)在NetZoomIn类代码窗口顶部的向导栏,点击左侧的下接列表,并选中Icommand;[图五]3)在右侧的下接列表中,选择Icommand接口的第一个成员Bitmap,Bitmap属性的代码框架将被添加到代码窗口中;4)重复2)-3)步,将所有Icommand接口的成员代码框架添加到代码窗口中;5)点击Ctrl+Shift+S,保存项目中所有的文件。[图六]2.6添加Icommand接口成员代码:现在开始向Icommand接口的成员中添加代码。1)向类中添加如下所示的代码段,下面的变量成员将被Icommand接口所使用。PublicClassNetZoomInImplementsICommandPrivatem_appAsIApplication'ArcMap应用程序接口Privatem_enabledAsBoolean'此命令是否有效Privatem_bitmapAsBitmap'此命令显示于工具栏上的位图Privatem_hBitmapAsIntPtr'位图指针#RegionCOMGUIDs成员变量在类定义的开始部份进行声明。2)在NetZoomIn代码窗口,卷动并找到OnCreate方法,添加如下代码到该方法:PublicSubOnCreate(ByValhookAsObject)ImplementsESRI.ArcGIS.SystemUI.ICommand.OnCreate'该类创建时实现的功能,引用ArcMap应用程序,并使用该命令处于有效状态IfNot(hookIsNothing)ThenIfTypeOf(hook)IsIMxApplicationThenm_app=CType(hook,IApplication)m_enabled=TrueEndIfEndIfEndSub3)向上卷动代码窗口,找到OnClick方法,添加如下代码以完成当前活动视图的放大动作:PublicSubOnClick()ImplementsESRI.ArcGIS.SystemUI.ICommand.OnClick'鼠标点击该命令按钮时,实现的功能DimmxDocAsIMxDocument=CType(m_app.Document,IMxDocument)DimactiveViewAsIActiveView=mxDoc.ActiveViewDimcurrExtentAsIEnvelope=activeView.ExtentcurrExtent.Expand(0.5D,0.5D,True)activeView.Extent=currExtentactiveView.Refresh()EndSub4)编辑代码块,以实现Category,Caption,Checked,Enabled,Helpfile,HelpContextID,Name,Message,以及Tooltip等方法,实现该命令的一些返回信息。PublicReadOnlyPropertyCaption()AsStringImplementsICommand.CaptionGetReturn放大工具EndGetEndPropertyPublicReadOnlyPropertyCategory()AsStringImplementsICommand.CategoryGetReturnNetCmdsEndGetEndPropertyPublicReadOnlyPropertyChecked()AsBooleanImplementsICommand.CheckedGetReturnFalseEndGetEndPropertyPublicReadOnlyPropertyEnabled()AsBooleanImplementsICommand.EnabledGetReturnm_enabledEndGetEndPropertyPublicReadOnlyPropertyHelpContextID()AsIntegerImplementsICommand.HelpContextIDGetReturn0EndGetEndPropertyPublicReadOnlyPropertyHelpFile()AsStringImplementsICommand.HelpFileGetEndGetEndPropertyPublicReadOnlyPropertyMessage()AsStringImplementsICommand.MessageGetReturn当前视图放大一倍显示.EndGetEndPropertyPublicReadOnlyPropertyName()AsStringImplementsICommand.NameGetReturnNetCmds_放大工具EndGetEndPropertyPublicReadOnlyPropertyTooltip()AsStringImplementsICommand.TooltipGetReturn放大一倍EndGetEndProperty2.7完成工具的图标部份(Icommand::Bitmap)现在需要添加一个已存在的位置文件到当前项目中,做为本命令按扭显示的图标,这里要添加对System.Drawing库的引用。1)在解决方案资源管理器窗口,右击VBNetCmds项目,然后点击添加,并选择添加现有项;([图七])2)在添加现有项对话框中,在文件类型部份的下接列表中选择图像文件,并定位到要添加的位置文件(本例中为ZoomIn.BMP),点击打开按钮,将该位图添加到项目中。([图八])3)在解决方案资源管理器窗口中,选择刚刚添加的ZoomIn.BMP项目,在下面的属性窗口中的生成操作条目的下接列表中选择嵌入的资源选项。([图九])4)返回到该命令的代码窗口,添加如下的代码到类构结构中:PublicSubNew()MyBase.New()Dimres()AsString=GetType(NetZoomIn).Assembly.GetManifestResourceNames()If(res.GetLength(0)0)Thenm_bitmap=New_Bitmap(GetType(NetZoomIn).Assembly.GetManifestResourceStream(res(0)))IfNot(m_bitmapIsNothing)Thenm_bitmap.MakeTransparent(m_bitmap.GetPixel(1,1))m_hBitmap=m_bitmap.GetHbitmap()EndIfEndIfEndSub[图七][图八][图九]注意:GetHbitmap方法不受控的WindowsGDI位图对象,这个对象必须使用特定的方法进行删除,因为.net垃圾收集器不能清除不受控的资源。可以在如下的两个步骤5)及6)中完成删除操作。5)向上卷动代码窗口,在类声明内部添加如下代码:PublicClassNetZoomInImplementsICommandDllImport(gdi32.dll)_PrivateSharedFunctionDeleteObject(ByValhObjectAsIntPtr)AsBooleanEndFunctionDllImport表达式部份提供了对GDI32.DLL库中的DeleteObject函数的访问声明。6)向下卷动代码窗口,在类结构的底部添加如下代码:ProtectedOverridesSubFinalize()If(m_hBitmap.ToInt32()0)ThenDeleteObject(m_hBitmap)EndIfEndSub以上这段代码在垃圾收集器需要消毁NetZoomIn类实例时被调用,它重载了System.Object.Finalize方法。7)最后添加如下代码到Icommand::Bitmap方法中,并返回Bitmap名柄。PublicReadOnlyPropertyBitmap()AsIntegerImplementsICommand.BitmapGetReturnm_hBitmap.ToInt32()EndGetEndProperty2.8声明你的类
本文标题:如何在VB.NETIDE环境下开发ArcMap定制组件(PDF14)(1)
链接地址:https://www.777doc.com/doc-915039 .html