第3章 自定义用户接口Word文档格式.docx
《第3章 自定义用户接口Word文档格式.docx》由会员分享,可在线阅读,更多相关《第3章 自定义用户接口Word文档格式.docx(70页珍藏版)》请在冰豆网上搜索。
●你可以增加、删除或重定义用户接口中的标准。
●你可以用VB编写代码应用与项目中。
所有的ArcMap中的自定义都可以储存与一个图像文件或图像模板中。
你对ArcMap桌面内容、图像的设计、工具栏和指令的修改以及你编写的VBA代码都将保存到一个图像文件中。
一个图像文件可以保存在系统中的任何地方,它的扩展名为mxd。
图像模板
如果标准模板不存在的话,ArcMap江南自动创建一个标准模板。
如果你无意识的做了一些定义,如删除工具栏和指令项,你只要删除Normal.mxt文件,然后用户接口会自动创建一个新的Normal.mxt文件。
这比撤消自定义更简单一些。
你可以用图像模板通过工程或文件在一个结构中广泛地传播用户的自定义。
图像模板是中图像文件。
在几乎所有方面,图像模板和图像文件在结构上是一致的。
功能上的不同是ArcMap把认识和使用模板当作创建新图像文件的起始点。
这与你如何在MicrosoftOffice软件中使用模板是类似的。
任何用户接口或VBA工程的自定义都是创建新图像文件的一部分。
此外,任何的模板的变化都将在下一次调用时传递给基于模板的文件。
在ArcMap中,模板和文件可分为三个级别。
你可以通过保存你的自定义到下一个级别中来确定你自定义的范围。
自定义图像文档
当你在处理一幅图像时,你给数据添加说明、设计图像的输出、定义用户接口以及编写VBA代码。
所有这些都将始终与文件相关。
用工程模板有选择性自定义
其他的工程和用户也可以使用你制定的模板。
模板可以作为一个新的图像文件的起点。
这个新的图像文件从模板中继承了你的自定义。
用标准模板进行完全自定义
这里介绍ArcMap中三个加载的模板——标准模板、工程模板和工程如何在VBA浏览器中显示。
ArcMap中有一种特别的模板叫做标准模板,它储存了启动ArcMap需要载入的自定义用户接口。
你对标准模板做的改变将被以后打开的所有图像文件所继承。
当你在安装完ArcMap后第一次运行时,标准模板会自动创建在profiles文件夹中。
它在不同操作系统的文件的位置如下:
WindowsNT:
C:
\WINNT\Profiles\<
yourusername>
\ApplicationData\ESRI\ArcMap\Templates\
Windows2000:
C:
\DocumentsandSettings\<
这个缺省的标准模板包含了所有的标准工具栏、指令、放置工具栏和目录的缺省位置。
你对标准模板的定义将储存在这个文件中。
如果你希望在每次运行ArcMap时都显示这些改变,就把它们储存在标准模板中。
假设你的管理员已经定义了工具栏或工具,而且她希望每个属于该组织的人都可以使用它们。
你的管理员可以用它代替缺省标准模板。
为了实现这个目的,你的管理员可以将她自定义的标准模板文件Normal.mxt复制到以下位置:
\ArcGIS\arcexe81\bin\templatesfolder。
这样每个人使用的都是她定义的标准模板。
下面演示的是它如何工作的。
如果你在运行ArcMap时没发现有标准模板,软件会自动在以下位置中寻找\ArcGIS\arcexe81\bin\templatesfolder,如果找到,则将其复制到profiles文件夹中,并将其视做个人标准模板。
然而,你使用的并不是组织内的标准模板,而是你可自定义的模板。
如果在profiles文件夹或\ArcGIS\arcexe81\bin\templatesfolder中没有Normal.mxt文件将创建在profiles文件夹中。
3.2.3自定义ArcCatalog
你可以用以下方法自定义ArcCatalog:
●你可以添加、删除或重组标准用户接口中的元素。
●你可以用VB编写代码。
ArcCatalog并不像ArcMap那样利用整个文件和模板的结构。
ArcCatalog软件不是基于文件或基本模板;
它只使用标准模板。
因此,所有ArcCatalog的自定义接口都储存在标准模板中。
如果在安装软件后第一次使用ArcCatalog,一个标准模板Normal.gxt会自动创建在profiles文件夹,不用操作系统下的位置如下:
\ApplicationData\ESRI\ArcCatalog\
3.3Application组件类
这个程序是一个核心对象,它代表了ArcGIS软件。
通过这个软件,你可以获得属性和功能以及操纵其它元素,如文档、窗口控制和状态栏。
每一个运行的ArcGIS程序通过对象呈现出来——ArcCatalog通过ESRIArcCatalog对象库中的程序。
ArcMap通过ESRIArcMap对象库中的程序。
IGXApplication在第七章中介绍。
IMXApplication在第四章中介绍。
Iapplication的接口被两个程序类共用。
当ArcGIS程序运行时,一个程序对象在VBA运行。
它在所有的对象中有效,你可以用以下方法查阅程序的属性。
MsgBoxApplication.Caption
你可以在VB或其他COM语言中运行ArcMap程序。
例如,在VB中运行ArcMap创建一个新的项目,在ESRI核心库中添加一个介绍,把以下代码添加在Sub中并执行它。
Dimm_docAsIDocument
Setm_doc=NewMxDocument'
startArcMap
扩展功能是个子系统可以给软件添加重要的功能。
空间分析就是个很好的例子。
VC++项目使用#import直接获取类别信息。
引入esriCore.olb可以自动在ArcGIS接口中建立“smartpointer”类。
用smartpointer可以用以下方法创立ArcMap实例:
//Example:
CreatinganinstanceofArcMap
IDocumentPtripDoc(CLSID_MxDocument);
文档包含自定义用户接口设置、VBA过程和其它设置如层和图像扩展等。
你可以打开或保存文档。
在IApplication接口中可获得文件对象,扩展功能、状态栏对象、模板对象、目前选择的工具和VB编辑器。
你可以用打开、保存和打印等功能;
锁定和解锁自定义程序;
显示对话框;
退出程序。
ArcCatalog并不包含有创建新文件、打开文件、打印文件、打印预览和保存为文件的功能。
保存文件功能是保存标准模板而不是保存文件。
程序对象包含有IVbaApplication接口,可以允许你编辑插入、删除和运行VBA代码而不用打开VB编辑器。
为了进入这个接口,在软件中运行QI。
这个IVbaApplication接口有创建新的模板、在模板中插入代码、删除模板和运行macro的功能。
下面是如何创建一个新的VBA模板,在模板中插入VBAmacro和运行宏的代码:
DimpVbaAppAsIVbaApplication
DimsAsString
SetpVbaApp=Application
pVbaApp.CreateCodeModule"
Project"
"
MyModule"
s="
PublicSubMyMacro"
&
vbNewLine&
_
"
MsgboxApplication.Document.Title"
"
EndSub"
pVbaApp.InsertCode"
s
pVbaApp.RunVBAMacro"
MyMacro"
Nothing
IMultiThreadApplication接口有用程序注册和注销线程管理和返回程序ID的功能。
MultiThreading是指一种软件配置,可以使用执行中的独立路径。
每个线程有它自己的堆栈和它自己的CPU声明。
软件对象必须遵循IMultiThreadApplication接口,它提供了简单的注册用户线程管理对象的回应机制。
一个线程管理对象必须遵循IDllThreadManager接口。
线程管理对象可在程序关闭前被告知,所有所有当前运行的线程可以在程序关闭前退出。
如果你开发了可以创建线程和用在ArcGIS程序进程中的组件,包含有这些组件的DLL也要遵循ThreadManager接口来注册这个线程管理对象。
IDllThreadManager接口有一个OnShutdown的功能可以同志DLL线程管理对象这个程序即将关闭,这样DLL线程管理可以终止这些在DLL中创建的线程。
IWindowPosition接口有移动和定义窗口大小的功能。
所有的窗口对象都可以在这个接口中执行。
所有的ArcGIS程序窗口可以在这个接口执行;
你可以QI从程序到IWindowPosition。
左方和上方属性确定了窗口左上角在屏幕中的位置。
高度和宽度属性确定了窗口的大小,用移动功能可以同时设置这四个属性。
EsriWindowState例举了窗口是否在标准、最小或最大状态。
以下在标准模板ThisDocument窗口中通常用来确定大小和位置的代码:
PrivateFunctionMxDocument_NewDocument()AsBoolean
DimpWindPosAsIWindowPosition
SetpWindPos=Application
pWindPos.Move10,10,600,500
EndFunction
PrivateFunctionMxDocument_OpenDocument()AsBoolean
3.4扩展ArcGIS软件
扩展功能提供了一个强大的机制,可以用来扩展ArcGIS软件的核心功能。
扩展功能可以给工具栏添加新的工具,读取事件并做出回应,展示有效特征等。
一个扩展功能提供了软件的扩展机制。
开发人员在软件中创建新的指令和工具时扩展功能是开发的中心部分。
通常这些指令和工具要有共同的数据或进入共同的UI组件。
扩展功能是储存数据和开发UI组件的逻辑中心。
主要的原因是每个运行的程序只有一个扩展功能的实例,而且在IApplication接口中可以给扩展功能定位并且运行它。
所有在程序中注册的扩展功能是由程序自动读取和卸载的。
用户在最后不用去读取或卸载。
例如,一个已经加载到ESRIMxExtension组件的扩展功能可以随着ArcMap一起启动和关闭。
当定义一个ArcGIS程序时,你可以在普通的或用户锁定的环境下传递这些定义。
普通或用户锁定的环境通常指对应的扩展功能和OEM产品。
在一般环境下,你作为一名开发人员,没有控制用户环境的权利。
你的定义必须与许多潜在的其他用户的定义和谐相处。
这是ESRI提供的一种类型。
在一个用户锁定的环境下,你作为一名开发人员,有控制软件的安装和用户在这个环境中操作的权利。
因为这个自定义机制在上述两种环境下是相同的,所以在开发一个软件时必须遵循一些规定。
作为一个开发人员,如果你最初是在用户锁定环境进行自定义开发,你就不能把你的自定义传递给一般的ArcGIS用户,你必须设计一种方法来解决在锁定情况下问题。
3.4.1一般软件的开发方法
如果你怀疑这个方法是否符合你的软件,你不能删除任何不属于你的东西。
这样,一般的自定义可以作为用户ArcGIS系统的一个扩展功能。
下面是创建一般自定义的规则:
●不能删除UI组件,如按钮、工具和属性项,这些东西并不属于你。
●如果过滤器是应用与一个特殊的文件,你的扩展功能不能用自定义过滤器
●不可以在文件中做持续性的改变,这会让之前你保存的文件无效。
●不可以异常中断文件。
●如果你的扩展功能工作得到许可,你的扩展功能必须遵循IExtensionConfig并且符合ArcGIS扩展功能的惯例。
更多的内容将在这一章的最后介绍。
3.4.2锁定程序发展规则
虽然一般程序的规则都不符合创建锁定程序,但最好使你的代码在应用中无懈可击。
如果不这样,一个小的冲突也会让你的代码失败。
例如,用于锁定程序的扩展功能设计可以用自定义过滤器。
虽然如此,在使用自定义过滤器时你必须做好准备看其是否已经被使用。
下面的代码是一个试图应用自定义过滤器失败的例子:
PrivateFunctionm_pDoc_OpenDocument()AsBoolean
OnErrorGoToFilterErr
'
ResettheLockwhenadocumentisopened.
m_pApp.LockCustomization"
mylock"
m_MyFilter
ExitFunction
FilterErr:
MsgBox"
AttemptToLockDocumentWithFilterFailed"
_
vbOKOnly+vbExclamation,"
ExtensionError"
3.4.3扩展功能的创建和工作
软件对象必须符合IExtensionManager接口。
这个接口有获得特殊的扩展功能和计算有多少扩展功能将被加载的属性。
在进入程序扩展管理部分之前,先QIforIExtensionManager。
注意其他类型的对象也必须遵循IExtensionManagert。
例如,编辑工具栏是管理编辑扩展的一个扩展功能。
因此,编辑对象也遵循IExtensionManager。
这个VBA代码用程序扩展管理部分在当前加载的所有扩展功能中循环,然后报告扩展功能的名称。
DimpExtMgrAsIExtensionManager,pExtAsIExtension
DimiasInteger
SetpExtMgr=Application
Fori=0TopExtMgr.ExtensionCount-1
SetpExt=pExtMgr.Extension(i)
MsgBoxpExt.Name
Next
这并不能获得扩展功能的说明。
IApplicaiton接口有FindExtensionByCISID和FindExtensionAccelerators功能。
为了创建自己的扩展功能并遵循IExtension界面,你可以有选择性地遵循IExtensionConfig和IExtensionAccelerators。
IExtension接口允许你给扩展功能定义名称和说明扩展功能启动和关闭时该做什么。
下面的代码演示了如果创建一个在遇到文件事件做出行动的自定义扩展功能。
当扩展功能加载同时,一个信息框弹出当一个新的文件被创建并打开时。
ImplementsIExtension
Dimm_pAppAsIApplication
NeedtolistenfortheMxDocumentevents
DimWithEventsm_pDocEventsAsMxDocument
PrivatePropertyGetIExtension_Name()AsString
IExtension_Name="
MyExtension"
EndProperty
PrivateSubIExtension_Shutdown()
ClearthereferencetotheApplicationandMxDocument
Setm_pApp=Nothing
Setm_pDocEvents=Nothing
Setm_pDoc=Nothing
EndSub
PrivateSubIExtension_Startup(initializationDataAsVariant)
Setm_pApp=initializationData
StartlisteningfortheMxDocumentevents.
Setm_pDocEvents=m_pApp.Document
Setm_pDoc=m_pApp.Document
PrivateFunctionpDoc_NewDocument()AsBoolean
Creatinganewdocument."
PrivateFunctionpDoc_OpenDocument()AsBoolean
Openingadocument"
如果你希望在扩展对话框中显示扩展功能。
你需要遵循IExtensionConfig接口。
扩展对话框中允许用户打开或关闭扩展功能。
IExtensionConfig接口在扩展对话框中提供了扩展功能的名称和描述,它也详细说明了扩展功能的状态。
扩展对话框允许你打开或关闭扩展功能。
EsriExtensionState例举是用来详细说明扩展功能是被允许、禁止或是无效。
扩展功能的状态是基于用户的。
当扩展功能安装后,它的缺省状态是未选中的,用户必须有意地在扩展对话框中选种扩展功能。
当用户在扩展对话框中选中了一个扩展功能,会发生下面的问题。
●选中的扩展功能状态被保存在注册处的用户设置中。
●扩展功能需要得到许可管理器的许可。
●如果许可是有效的,扩展功能传递的在工具栏上的工具将可以使用。
●如果许可是无效的,扩展功能传递的在工具栏上的工具将不可以使用。
此外,在扩展对话框的名称右边将显示许可无效。
当用户未在扩展对话框中选中ArcGIS扩展功能,会出现以下情况:
●扩展功能证实它并不在程序中被使用。
●如果在程序中使用了该扩展功能。
它不会让自己停留在未选中状态,而且会弹出警告消息。
●扩展功能的未选中状态将会保存在注册处的用户设置里。
●如果扩展的工具栏是活动的,适当的工具将是无效的。
●如果扩展功能让许可管理器知道它将不会在程序中用到许可证,许可管理器释放该扩展功能的许可证。
IExtensionConfig接口是与ESRI获得许可证的途径独立的,所以你作为一个开发人员可以使解决许可的问题一体化。
或者,如果你的扩展功能没有与许可管理器一起工作,你不必担心请求和释放许可。
你可以遵循IExtensionConfig来使你的扩展工具栏上的工具有效或无效。
下面的代码使取自一个类模板,它遵循IExtension展示如何使用IExtensionConfig接口。
ImplementsIExtensionConfig
Privatem_pExtStateAsesriExtensionState
PrivatePropertyGetIExtensionConfig_Description()AsString
IExtensionConfig_Description="
Thisisthesampleextension."
PrivatePropertyLetIExtensionConfig_State(ByValRHSAs_
esriCore.esriExtensionState)
m_pExtState=RHS
PrivatePropertyGetIExtensionConfig_ProductName()AsString
IExtensionConfig_ProductName="
SampleExtension"
PrivatePropertyGetIExtensionConfig_State()As_
esriCore.esriExtensionState
IExtensionConfig_State=m_pExtState
这个程序有一个处理ArcMap文件的特殊扩展数据的机制。
例如,有些ArcGis的扩展把它们层的类型保存在文件中。
当用户打开这样一个文件,特殊扩展层将被加载并试图创建该层。
创建该层也许会失败,这是由于以下原因:
●扩展功能未安装。
●扩展功能未在扩展对话框中安装。
●扩展功能被选中,但当前的许可无效。
在这些失败的例子中,会有警告提示你问题处在哪。
文件即被打开而没有特殊扩展层。
虽然如此,如果安装了扩展功能,在扩展对话框中被选中,就可以成功得到许可证,然后打开文件。
如果你希望扩展功能的命令拥有快捷键,你的扩展功能需要符合IExtensionAccelerators。
IExtensionAccelerators有个功能叫CreateAccelerators,可以为扩展功能创建快捷键。
只有在软件安装时创建快捷键,当新的文件被创建或当文件打开时这个功能才被使用。
快捷键和快捷键表格将在本章的后面介绍。
当你用CreateAccelerators功能把一个快捷键指配个扩展功能上的命令,确保其他的命令没有使用你将使用的关键部分。
下面的代码摘自一个类模型,它也符合extension也展示给你