wangaofang
路人甲
路人甲
  • 注册日期2006-09-26
  • 发帖数18
  • QQ
  • 铜币229枚
  • 威望0点
  • 贡献值0点
  • 银元0个
阅读:2360回复:3

[求助]如何编写带窗口的组件类?

楼主#
更多 发布于:2011-11-29 10:21
<p>我们知道,可以用VS2005或VS2008编写一个组件类,实现诸如ICommand或者ITool或者IDocwindow等接口来实现自定义命令或者工具。</p>
<p><br/>但是现在我想创建一个组件,类似ArcMap中的Identify工具,点一下,就弹出一个窗口,可以和用户交互什么的,可是谁能告诉我如何实现呢?<br/></p>
<p>最终的目标就是编译成一个DLL,随便拿到别人电脑上就可以加载使用的那种,请问哪位高手能出来指点一下?</p>
喜欢0 评分0
gis
gis
管理员
管理员
  • 注册日期2003-07-16
  • 发帖数15945
  • QQ554730525
  • 铜币25337枚
  • 威望15352点
  • 贡献值0点
  • 银元0个
  • GIS帝国居民
  • 帝国沙发管家
  • GIS帝国明星
  • GIS帝国铁杆
1楼#
发布于:2011-11-29 11:08
<p>在ICommand的事件里,编写你的弹出窗口和交互的代码就行了。</p>
<p> </p>
举报 回复(0) 喜欢(0)     评分
gis
gis
管理员
管理员
  • 注册日期2003-07-16
  • 发帖数15945
  • QQ554730525
  • 铜币25337枚
  • 威望15352点
  • 贡献值0点
  • 银元0个
  • GIS帝国居民
  • 帝国沙发管家
  • GIS帝国明星
  • GIS帝国铁杆
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>
举报 回复(0) 喜欢(0)     评分
wangaofang
路人甲
路人甲
  • 注册日期2006-09-26
  • 发帖数18
  • QQ
  • 铜币229枚
  • 威望0点
  • 贡献值0点
  • 银元0个
3楼#
发布于:2011-11-29 16:15
谢谢了。
举报 回复(0) 喜欢(0)     评分
游客

返回顶部