Office 2007文件以Microsoft的OpenXML格式发布,是包含几个XML文件的一个简单的压缩容器。使用XML格式的文件具有下列优点:
(1)XML文件能够明显地节省空间。
(2)通过XML结构化数据后,能够快速地被索引,因而能使其他程序通过索引搜索到特定的字符串或其他项目。
(3)对于开发者来说,能够链接某个应用程序里的XML架构来验证XML而确保代码像意料中的那样工作。例如前面介绍的CustomUI Editor和XML Notepad,如果没有这些架构,CustomUI Editor将不能验证代码,XML Notepad也不能提供智能感知功能。
当然,我们之所以关心XML,是因为XML是功能区的核心。要定制Office 2007用户界面,必须编写XML代码。虽然VBA在定制界面时也能起到关键的作用,但它不是必需的。而XML在定制中几乎总是必需的,但也有例外。例如弹出式菜单和一些出现在加载项选项卡中的VBA定制。
下面,我们来了解如何构成XML代码,以及如何编写XML。
标签(Tags)
先看看下面的代码片断:
<group id=”rxgrpTest”>
<button idMso=”Bold”/>
<button idMso=”Italic”/>
<splitButton id=”rxsbtnTest”>
<button idMso=”Underline”/>
</splitButton>
</group>
留意上面代码的结构,注意<、>和/号的使用,这些符号在XML中有特定的用途:指出了标签的开始和结束位置。例如,开始的<group>标签和结束的</group>标签之间的内容包含了在功能区中显示的组。
在组里面列出的splitButton标签使用与组相同的结构,以<splitButton>标签开始,接着包含了所有的项目直至由</splitButton>标签结束。本例中,仅仅下划线按钮出现在拆分按钮中。
现在,看看按钮本身的代码,注意到/号位于标签的结尾,这样就不需要单独的标签来关闭元素。
这里演示了用于开始和结束XML标签的两种方法。您需要理解和使用这两种方法来创建自定义UI的结构。如下所示:
开始和关闭标签分开:<element attribute(s)=”Value”></element>
开始和关闭标签未分开:<element attribute(s)=”Value”/>
通过上面的例子,应该了解到:
(1)在XML中,每个标签至少包含一个元素并且通常至少有一个属性。
(2)在处理代码时,涉及的每个项目都被称作对象(object)。例如,对象包括功能区中的组、按钮、复选框、甚至是菜单。许多对象都有子对象。当某控件有子控件时,该控件称作为父控件。注意,父对象通常(但不总是)有不同类型的子对象。选项卡有一个或多个组对象作为子对象,并且一个组可能有按钮、复选框和动态菜单子对象的组合。其中,dynamicMenu对象除了其他子对象类型外,还有dynamicMenu子对象。某些父对象甚至有完整的子对象群,称之为集合(collection)。
每个子对象同时也是它自已的子对象的父对象。每个子对象控件必须嵌套在其父对象的开始和结束标签中。并且,每个子对象仅可能有一个父对象。
(3)为了创建格式良好(有效的)XML,必须理解:①所有的标签,无论是元素还是属性,都区分大小写,即SPLITBUTTON元素与splitButton元素不相同。②属性值必须被放置在单引号或双引号内。③在父元素中的子元素的嵌套必须准确,每个开始标签必须与其结束标签相匹配,或者使用“/>”结束在相同的标签内,或者在后面使用单独的标签。
元素(Elements)
当处理功能区的XML时,可以看到每个元素指定功能区控件(或结构)的特定部分。
对于初学者来说不容易弄清楚标签和元素的区别,然而很容易定义:group是一个元素,而<group>是一个标签。因此,标签实质上是通过<和>符号识别代码块的标志。
每个标签必须包括一个且唯一一个元素。此外,元素总是XML标签的第一部分,告诉编译器希望开始处理或者停止处理的特定项目。
属性(Attributes)
标签告诉编译器要处理的对象,而属性告诉编译器该对象的特性,例如对象的名称、在屏幕中显示的标题以及是否对象可见。
与元素不同的是,在所给标签内可以为对象设置多个属性。例如,下面的代码片断显示了带有多个属性的标签示例:
<button id=”rxbtnProtectAll”
size=”normal”
label=”Protect All Sheets”
imageMso=”ReviewProtectWorkbook”
onAction=”rxbtnProtectAll_click”/>
上面的代码提供给按钮一个唯一的id并指定了大小、标签文本和图像,还提供了一个onAction回调签名,当单击该按钮时启动相应的VBA过程。
1、id属性
在创建额外的对象之前,需要探讨如何在代码中识别这些对象。而id属性用于识别在自定义XML代码内特定的对象,为其提供名称,使得后面能够使用该名称引用该对象。这是引用对象的唯一方法。在下列容器中每个对象都需要id属性:
n contextualTabs
n officeMenu
n qat
n tabs
id属性有几种不同的类型并且每一个都有不同的用途。下面列出了id属性的不同类型及其主要用途。
n id属性用于唯一地标识控件。如果动态地装载项目,其属性将被赋值。
n idMso属性用于唯一地标识内置控件、选项卡、命令,等等。使用该属性与内置对象交互。
n idQ属性用于跨共享的命名空间引用对象。
为了识别某对象,只需简单地在开始标签中添加id属性,例如,要通过id引用某选项卡,使用下列XML:
<tab id=”rxtab”
<!—放置其它的选项卡属性! –>
</tab>
同样地,如果试图引用内置的字体(Font)组,则使用下面的XML:
<group idMso=”Font”
<!—放置其它的组属性! –>
</group>
注意,所有的id和idQ属性都是唯一的。如果使用已存在的id,或者由Microsoft保留的id,将会导致错误并阻止装载自定义用户界面。
为了避免与内置的控件相冲突,建议所有自定义控件使用标准的命名约定加上前缀。
2、label属性
label属性指定用户能够在屏幕上读取的内容,它不必是唯一的,但应该合乎逻辑、简洁明了且一致。label属性为用户提供了清晰的向导。要为控件添加标签文本,使用下面所示的代码:
<tab id=”rxtab”
label=”My Custom Tab”>
</tab>
XML代码的排版技巧
在编写代码时,建议使用硬回车或制表符将代码分成逻辑块,使代码更容易阅读和理解。看看下面的示例代码,非常清晰,更容易阅读:
<group
id=”rxgrp”
label=”My First Group”>
<button
id=”rxbtn1″
imageMso=”Italic”
label=”Large size button”
size=”large”
onAction=”rxbtn1_Click”/>
<button
id=”rxbtn2″
imageMso=”Bold”
label=”Normal size button”
size=”normal”
onAction=”rxbtn2_Click”/>
<button
id=”rxbtn3″
imageMso=”WrapText”
label=”Normal size button”
size=”normal”
onAction=”rxbtn3_Click”/>
<button
id=”rxbtn4″
imageMso=”ConditionalFormatting”
label=”Normal size button”
size=”normal”
onAction=”rxbtn4_Click”/>
</group>
在XML代码中创建注释
注释能够使自已或他人清楚代码的作用。
放置注释的方法是:在开始处放置一个小于号(<),然后输入感叹号(!),随后是两个连字号(–),结束注释需要两个连字号加一个大于号(>),例如:
<!—这是一段注释 –>
如果注释很长,可能需要几行,那么可以按如下所示编写:
<!–
这是一段相当长的注释。因为您想使用长的注释解释这段代码有什么作用,各个符号代码什么意思,以帮助您以后好理解。
–>
在<!–和–>之间的内容被当作连续的注释。
此外,不能够将注释放置在一块开始的XML代码的中间。下面的示例来进行演示:
<!—这是我的按钮 –>
<button id=”rxbtn”
label=”This is my button”
imageMso=”HappyFace”
size=”large”
onAction=”rxbtn_Click”/>
或:
<button id=”rxbtn”
label=”This is my button”
imageMso=”HappyFace”
size=”large”
onAction=”rxbtn_Click”>
<!—这是我的按钮 –>
</button>
上述两段代码都是正确的,但下面的代码会产生错误:
<button id=”rxbtn”
<!—这是我的按钮 –>
label=”This is my button”
imageMso=”HappyFace”
size=”large”
onAction=”rxbtn_Click”/>
上面的问题在于注释被插入到了未关闭的代码块中。