第3章 自定义用户接口

导读:作为框控件或联合框控件使用的指令要符合IToolControl接口,如果一个联合框控件在一个用户在联合框中选择一个选项时失去了焦点,3.23SubtypedCommand自定义类,创建一个符合ICommand和ICommandSubtype接口的customS,你可以使用ICommandSubtype接口让你清楚有多少国图表类型,你可以让每个图表类型的属性代替多次符合ICommand接口,3.

第3章 自定义用户接口

工具控件是一个下拉列表框控件、可编辑文本框控件或其它类型的控件,并可以添加到工具栏中。

作为框控件或联合框控件使用的指令要符合IToolControl接口。一个符合IToolControl的指令传递自己的窗口控制给程序。

当ToolControl对象获得焦点,一个ICompletionNotify把当作IToolControlOnFocus功能的complete对象传递给ToolControl。ToolControl需要用ICompletionNotifySetComplete功能来让程序知道这个control会失去焦点。

在以下的VB代码中,bWnd属性传递回VB工程形式中联合框控件的窗口控制。OnDrop功能说明了ToolControl只能丢弃在工具栏中。在OnFocus功能中,ICompletionNotify对象有个变量在当ToolControl不再需要焦点时用来调用SetComplete。例如,如果一个联合框控件在一个用户在联合框中选择一个选项时失去了焦点,这个联合框的Click事件会调用SetComplete。

Implements IToolControl

Public pCompNotify As ICompletionNotify

Private Property Get IToolControl_hWnd () As esriCore.OLE_HANDLE IToolControl_hWnd = Form1.Combo1.hWnd End Property

Private Function IToolControl_OnDrop (ByVal barType As _esriCore.esriCmdBarType) As Boolean

If barType = esriCmdBarTypeToolbar Then IToolControl_OnDrop = True

End Function

Private Sub IToolControl_OnFocus (ByVal complete As _esriCore.ICompletionNotify) Set pCompNotify = complete End Sub

3.23 SubtypedCommand自定义类

创建一个符合ICommand和ICommandSubtype接口的custom SubtypedCommand类。

一个图表类型指令对象是一组相关的指令,它们可以共享属性。图表类型指令可以放在工具栏和菜单中。

当你要在一个单独的类中含有大于一个的指令,你可以使用ICommandSubtype接口让你清楚有多少国图表类型。然后,在符合每个ICommand的属性的同时,你可以让每个图表类型的属性代替多次符合ICommand接口。

这个VB代码段来自一个符合ICommand和ICommandSubtype的类;它指定了图表类型指令包含有两种图表类型。在ICommand的Caption属性中,有一种声明是用来决定哪种图表类型是被要求的。

Dim m_lSubType As Long

Private Function ICommandSubType_GetCount() As Long ICommandSubType_GetCount = 2

End Function

Private Sub ICommandSubType_SetSubType(ByVal SubType As Long) m_lSubType = SubType

End Sub

Private Property Get ICommand_Caption() As String Select Case m_lSubType Case 1

ICommand_Caption = \Case 2

ICommand_Caption = \End Select End Property

3.24 MultiItem自定义类

当菜单中的项不能确定是否先于运行时间或需要根据系统状态而修改时,可以使用MultiItem。一个很好的例子,File菜单底部的菜单项显示的是最近使用的文件。

一个MultiItem对象是一个动态指令它根据软件的状态,显示菜单中零个或更多的菜单项连接。

IMultiItem接口允许把一个单一从对象当作一个联系起来的菜单项。在运行时,框架机构通知MultiItem指令什么时候该显示主菜单。在这一点上,所有符合IMultiItem的指令可以请求系统确定该显示多少项和每个项如何显示。IMultiItem接口允许你设置属性值,如名称,比特图,有效状态和选中状态。当你创建MultiItem时你不需要符合ICommand接口。

我们理解的符合IMultiItem的主题是OnDrop功能。当含有MultiItem的菜单显示时需要用的该功能。OnDrop提供了与例示MultiItem的程序对象的联系,也用来设定MultiItem中的项的数目。下面的VB代码段获得了程序对象,文档对象和图像对象的说明。这个特殊的MultiItem可以包含与图像中每一层中对应的项,所有图层数目也返回了项数目的说明。

Dim m_pApp As IApplication 'ArcMap application Dim m_pMxDoc As IMxDocument 'ArcMap document

Dim m_pMap As IMap 'Current focus map

Dim m_pLayerCnt As Long 'Number of layers in the map

Private Function IMultiItem_OnPopup(ByVal hook As Object) As Long Set m_pApp = hook

Set m_pMxDoc = m_pApp.Document Set m_pMap = m_pMxDoc.FocusMap m_pLayerCnt = m_pMap.LayerCount IMultiItem_OnPopup = m_pLayerCnt End Function

3.25 AppRot类

AppROT对象显示了程序的运行对象,是当前运行的程序的综合列表。AppROT只包含符合IApplication接口的程序对象介绍。ArcMap和ArcCatalog和其它的ArcGIS程序启动时在运行对象表格中注册自己和在终止时从表格中删除自己。

程序中运行的对象表是个直接的类,它给你进入运行的ArcGIS软件的列表的入口。 先进的开发者可以用ArcObject来创建它们自己符合IApplication来创建custom standalone程序。它们可以通过Add和Remove功能来在AppROT中注册和删除程序参考。

Add功能返回一个长值叫做cookie,是程序的一个参考。它可以被客户程序保存下来在remove功能中长期使用。

下面的VBA代码在所有运行的程序和标题列表中重复。

Dim pAppROT as AppROT Set pAppRot = New AppROT Dim i as Integer

For i = 0 to pApprot.Count - 1

msgbox pAppROT.Item(i).Caption Next

AppROT事件让有关的程序和组件知道程序在什么时间启动和关闭。这将很有帮助如果听觉组件和程序需要保留到列表的转换时当它们要在运行的情况下同时显示,这样以来如果在某一个程序中发生了什么事,所有其它的程序可以被告知和适当的自己升级。这样的同步组件需要知道什么时候新的情况启动和什么时候存在的情况终止。

下面的VB代码,startListening例行程序初始化m_pAppROT变量,它可以听取IAppROTEvents,该事件中的代码用TypeOf关键码来决定哪个程序已开始和关闭,并用该信息报告消息。

Dim WithEvents m_pAppROTEvents As AppROT

Public Sub StartListening()

Set m_pAppROTEvents = New AppROT End Sub

Private Sub m_pAppROTEvents_AppAdded(ByVal pApp As IApplication) If TypeOf pApp Is IMxApplication Then MsgBox \

ElseIf TypeOf pApp Is IGxApplication Then MsgBox \End If End Sub

Private Sub m_pAppROTEvents_AppRemoved(ByVal pApp As IApplication) If TypeOf pApp Is IMxApplication Then MsgBox \

ElseIf TypeOf pApp Is IGxApplication Then

MsgBox \End If End Sub

3.26 ComponentCategoryManager组件类

ComponentCatagoryManager对象提供了一个机制可以设计添加和删除一个特殊类型中的新的组件和创建新的组件种类。

客户程序用组件类有效率的查找系统中安装的特定类型的组件。

例如,ArcMap只支持ICommand接口的指令。一个组件类型,ESRIMx指令,可以用来寻找所有可以在ArcMap内部使用的指令组件。如果没有用到组件类型,程序有必要例示每个COM组件和询问它如果它支持需要的功能,这个功能不是一个实际的方法。组件类型支持COM的扩展性允许用户程序的开发者创建和使用属于一个特殊类型的类。如果晚些时候在类型中添加了一个新类,用户程序不需要利用这些新类来改变,它会在下次读取类型时自己添加新类。

IComponentCatagoryManager接口有一些功能允许你创建新的组件类型,在类型中添加和删除持续对象,在类型中添加或删除所有属于某个类别的对象。为了进入IComponentCatagoryManager接口,可以创建一个ComponentCatagoryManager对象的新例。

下面的VB代码注册了一个明确的指令与ArcMap指令组件类型一起包含在DLL中。

Public Sub RegObj()

Dim dllPath As String

dllPath = \

Dim pCCMgr As IComponentCategoryManager Set pCCMgr = New ComponentCategoryManager

Dim objUID As New UID

objUID.Value = \

Dim catUID As New UID

catUID.Value = \

pCCMgr.SetupObject dllPath, objUID, catUID, True End Sub

3.27 MouseCursor组件类

你可以用MouseCursor把系统鼠标的光标设置成标准固定光标之一或一个自定义光标。这将会对你有帮助如果你想要显示一个等待光标当你的代码在执行一个大的进程时。

鼠标光标对象是系统鼠标光标对象的参考。

IMouseCursor接口有一个功能,SetCursor它可以设置系统光标的ID或有CursorID参数指定图像对象。这个光标会最大重设MouseCursor事例当它被释放事;这个事例在访问进程终止时释放;当无变量的鼠标光标参考时了;或当一些像显示一个对话框,忽略Windows消息时。下面的VBA代码用了固定的等待光标。当后台进程完成时光标是自动重置的。

cursorID的值可以用来把鼠标光标设置到某个固定的光标。

你可以设置一个自定义光标来代替使用固定光标;它可以用一个光标文件(.cur)或图表文件(.ico)。你可以把你的自定义光标存在一个图像控件重或用VB的LoadPicture功能来加载光标。

下面的VBA例子在UserForm1上设置一个图像控件的Picture属性的光标叫做Image1。

Public Sub WaitCurs()

Dim pMouseCursor As IMouseCursor Dim i As Integer

Set pMouseCursor = New MouseCursor pMouseCursor.SetCursor 2

For i = 0 To 10000

Application.StatusBar.Message(0) = Str(i) Next

五星文库wxphp.com包含总结汇报、考试资料、资格考试、IT计算机、党团工作、word文档、教学教材、计划方案、办公文档、文档下载以及第3章 自定义用户接口等内容。

本文共10页1<<910