阅读:2595回复:3
[求助]如何编写带窗口的组件类?
<p>我们知道,可以用VS2005或VS2008编写一个组件类,实现诸如ICommand或者ITool或者IDocwindow等接口来实现自定义命令或者工具。</p>
<p><br/>但是现在我想创建一个组件,类似ArcMap中的Identify工具,点一下,就弹出一个窗口,可以和用户交互什么的,可是谁能告诉我如何实现呢?<br/></p> <p>最终的目标就是编译成一个DLL,随便拿到别人电脑上就可以加载使用的那种,请问哪位高手能出来指点一下?</p> |
|
1楼#
发布于:2011-11-29 16:15
谢谢了。
|
|
2楼#
发布于:2011-11-29 11:08
<p>转载一篇文章给你参考。</p>
<p> </p> <p> 动态链接库英文为DLL,是Dynamic Link Library 的缩写形式,DLL不是可执行文件,DLL 是一个包含可由多个程序同时使用的代码和数据的库。 </p> <p>通过使用 DLL,程序可以实现模块化,由相对独立的组件组成。例如,一个计帐程序可以按模块来销售。可以在运行时将各个模块加载到主程序中(如果安装了相应模块)。因为模块是彼此独立的,所以程序的加载速度更快,而且模块只在相应的功能被请求时才加载。此外,可以更为容易地将更新应用于各个模块,而不会影响该程序的其他部分。例如,您具有一个建筑工程造价计算程序,而不同区域的建筑材料其价格不尽相同,而且随着时间的变化,建筑材料的价格也随着经济的发展而发生着变化,当这些变化被隔离到 DLL 中以后,您无需重新生成或安装整个程序就可以应用更新。</p> <p>DLL的优点: </p> <ol> <li>扩展了应用程序的特性; </li> <li>可以用许多种编程语言来编写; </li> <li>简化了软件项目的管理; </li> <li>有助于节省内存; </li> <li>有助于资源共享; </li> <li>有助于应用程序的本地化; </li> <li>有助于解决平台差异; </li> <li>可以用于一些特殊的目的。windows使得某些特性只能为DLL所用。 </li></ol> <p>DLL其实就是Windows平台下的一种类的文件编译格式,该格式的文件可以被任何支持COM规则的语言所支持和引用。ArcGIS Object组件本身的物理文件就是DLL文件,开发人员也可以编写自己的DLL组件进行二次开发。</p> <p>下面以一个实例来演示如何在Visual Basic环境下创建DLL组件。</p> <p>启动Visual Basic,建立一个ActiveX dll工程。如下图所示:</p> <p><a href="file:///C:/Documents%20and%20Settings/Administrator/Local%20Settings/Temp/WindowsLiveWriter-429641856/supfiles128E399/20101125_11372314.jpg"></a><a href="file:///C:/Documents%20and%20Settings/Administrator/Local%20Settings/Temp/WindowsLiveWriter-429641856/supfiles1200C2C/20101125_11372314.jpg"></a><img alt="" src="http://pic002.cnblogs.com/images/2010/140893/2010112515250035.jpg"/></p> <p>为工程添加引用,Projects>References打开References对话框,在对话框中选择ESRI System Object Library、ESRI SystemUI Object Library、ESRI Framework Object Library和ESRI ArcMapUI Object Library四个对象库。如下图所示:</p> <p><img alt="" src="http://pic002.cnblogs.com/images/2010/140893/2010112515255474.jpg"/><a href="file:///C:/Documents%20and%20Settings/Administrator/Local%20Settings/Temp/WindowsLiveWriter-429641856/supfiles128E399/20101125_1144507.jpg"></a><a href="file:///C:/Documents%20and%20Settings/Administrator/Local%20Settings/Temp/WindowsLiveWriter-429641856/supfiles1200C2C/20101125_1144507.jpg"></a> </p> <p>添加名为Form的窗体,向窗体中添加名为Picture1的图片框,设置Picture1的Picture属性,为其指定一个bmp格式的图标。</p> <p>下面可以开始编码了。打开Class1类模块文件,在开头加入如下代码:</p> <p>Option Explicit</p> <p>Implements ICommand <br/>Dim pApp As IApplication</p> <p>在General下拉框中选择ICommand接口,在Declarations下拉框中选择Bitmap,带自动出现的代码段中添加ICommand_Bitmap = Form1.Picture1.Picture.Handle来实现实现ICommand接口的BitMap属性。使用同样的步骤实现IComand接口的Caption、Category、Checked、Enabled、HelpContextID、HelpFile、Message、Name、ToolTip属性和OnClick与OnCreat方法。完整代码如下:</p> <div class="cnblogs_code"><img style="DISPLAY: none" id="code_img_closed_c147caf8-8a13-4419-8ce0-d0f4c8c19d8f" class="code_img_closed" alt="" src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif"/><img id="code_img_opened_c147caf8-8a13-4419-8ce0-d0f4c8c19d8f" class="code_img_opened" alt="" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"/><span class="cnblogs_code_collapse">代码</span> <div id="cnblogs_code_open_c147caf8-8a13-4419-8ce0-d0f4c8c19d8f"><pre><div><span style="COLOR: rgb(0,0,0)">Option Explicit</span></div><div><span style="COLOR: rgb(0,0,0)">Implements ICommand<br/>Dim pApp As IApplication<br/><br/>Private Property Get ICommand_Bitmap() As esriSystem.OLE_HANDLE<br/>ICommand_Bitmap </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> Form1.Picture1.Picture.Handle<br/>End Property<br/><br/>Private Property Get ICommand_Caption() As String<br/>ICommand_Caption </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(128,0,0)">"</span><span style="COLOR: rgb(128,0,0)">HSCommand</span><span style="COLOR: rgb(128,0,0)">"</span><span style="COLOR: rgb(0,0,0)"><br/>End Property<br/><br/>Private Property Get ICommand_Category() As String<br/>ICommand_Category </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(128,0,0)">"</span><span style="COLOR: rgb(128,0,0)">HSCustomTools</span><span style="COLOR: rgb(128,0,0)">"</span><span style="COLOR: rgb(0,0,0)"><br/>End Property<br/><br/>Private Property Get ICommand_Checked() As Boolean<br/><br/>End Property<br/><br/>Private Property Get ICommand_Enabled() As Boolean<br/>Dim pMxDoc As IMxDocument<br/>Dim pLayerCount As Integer<br/>Set pMxDoc </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> pApp.Document<br/>pLayerCount </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> pMxDoc.FocusMap.LayerCount<br/>If pLayerCount </span><span style="COLOR: rgb(0,0,0)">></span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(128,0,128)">0</span><span style="COLOR: rgb(0,0,0)"> Then<br/>ICommand_Enabled </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> True<br/>Else<br/>ICommand_Enabled </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> False<br/>End If<br/>End Property<br/><br/>Private Property Get ICommand_HelpContextID() As Long<br/>ICommand_HelpContextID </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(128,0,128)">1234</span><span style="COLOR: rgb(0,0,0)"><br/>End Property<br/><br/>Private Property Get ICommand_HelpFile() As String<br/><br/>End Property<br/><br/>Private Property Get ICommand_Message() As String<br/>ICommand_Message </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(128,0,0)">"</span><span style="COLOR: rgb(128,0,0)">This is my custom command</span><span style="COLOR: rgb(128,0,0)">"</span><span style="COLOR: rgb(0,0,0)"><br/>End Property<br/><br/>Private Property Get ICommand_Name() As String<br/>ICommand_Name </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(128,0,0)">"</span><span style="COLOR: rgb(128,0,0)">HSCustomTool_MyCommand</span><span style="COLOR: rgb(128,0,0)">"</span><span style="COLOR: rgb(0,0,0)"><br/>End Property<br/><br/>Private Sub ICommand_OnClick()<br/>MsgBox </span><span style="COLOR: rgb(128,0,0)">"</span><span style="COLOR: rgb(128,0,0)">Clicked on my command</span><span style="COLOR: rgb(128,0,0)">"</span><span style="COLOR: rgb(0,0,0)"><br/>End Sub<br/><br/>Private Sub ICommand_OnCreate(ByVal hook As Object)<br/>pApp </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> hook<br/>End Sub<br/><br/>Private Property Get ICommand_Tooltip() As String<br/>ICommand_Tooltip </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(128,0,0)">"</span><span style="COLOR: rgb(128,0,0)">HSCommand</span><span style="COLOR: rgb(128,0,0)">"</span><span style="COLOR: rgb(0,0,0)"><br/>End Property</span></div></pre></div></div> <p>编译该工程,以建立dll文件。至此,该动态链接库就建立好了。</p> <p>下面在ArcMap中使用刚建立的基于ICommad接口的自定义命令。启动ArcMap,Tools>Customize,弹出Customize对话框,切换到Toolbars选项卡,新建一个Toolbar。如下图所示:</p> <p><img alt="" src="http://pic002.cnblogs.com/images/2010/140893/2010112515264091.jpg"/><a href="file:///C:/Documents%20and%20Settings/Administrator/Local%20Settings/Temp/WindowsLiveWriter-429641856/supfiles128E399/20101125_1356363.jpg"></a><a href="file:///C:/Documents%20and%20Settings/Administrator/Local%20Settings/Temp/WindowsLiveWriter-429641856/supfiles1200C2C/20101125_135636.jpg"></a> </p> <p>切换到Commands选项卡,单击Add from file 按钮,导航至刚才建立的dll文件,这个自定义的命令就添加至ArcMap中了。在Categories列表框中找到HSCustomTools,在Commands列表框中找到HSCommand,将其拖拽至刚建立的自定义工具栏上。</p> <p>OK,向ArcMap中添加数据,测试一下自定义命令吧! ^_^ 效果如下:</p> <p><a href="file:///C:/Documents%20and%20Settings/Administrator/Local%20Settings/Temp/WindowsLiveWriter-429641856/supfiles128E399/20101125_1444569.jpg"></a><a href="file:///C:/Documents%20and%20Settings/Administrator/Local%20Settings/Temp/WindowsLiveWriter-429641856/supfiles1200C2C/20101125_1444569.jpg"></a><img alt="" src="http://pic002.cnblogs.com/images/2010/140893/2010112515274640.jpg"/></p> <p>本文重点在于对“使用动态链接库组件进行ArcGIS开发”这一开发方式进行介绍性演示,在开发DLL组件功能上没有深入探究。可根据实际需要扩展DLL功能。</p> |
|
|
3楼#
发布于:2011-11-29 11:08
<p>在ICommand的事件里,编写你的弹出窗口和交互的代码就行了。</p>
<p> </p> |
|
|