当创建COM加载项时,通常需要一种用户与加载项相交互的方式。在office以前的版本中,使用commandbars对象模型通过添加菜单项或工具栏按钮到应用程序中来完成这项操作。在Office 2007版中,大多数情况下自定义应用程序将继续在Fluent UI中工作而无需修改。然而,对commandbars对象模型的修改或者其它任何修改菜单和工具栏的技术,例如wordBasic或XLM,将在“加载项”选项卡中单独出现。这帮助用户查找需要处理的控件和以前使用的加载项。
要在Fluent UI中对项目进行修改,可以使用已经介绍的技术和代码。对于已存在的修改菜单结构的加载项,将在加载项选项卡中出现命令。
动态更新Fluent UI
返回控件属性的回调(例如库控件的getItemCount回调)通常仅在Fluent UI初始化时调用,除非强制该控件重新初始化。可以通过在代码中存储对Ribbon的引用来强制该操作发生,然后调用Ribbon的方法来使单个的控件或整个Ribbon无效。要实现该操作,必须在<customUI>元素中添加onLoad属性,指定回调过程。当RibbonX标记文件成功地装载时,调用onLoad回调一次。回调过程接受IRibbonUI对象作为参数,代码可以缓存该引用为以后使用。IRibbonUI类提供能使单独的控件或整个Ribbon无效的方法。
为了缓存IRibbonUI对象,以便可以在运行时更新控件,则可添加如下代码:
<customUI XMLns=”http://schemas.microsoft.com/office/2006/01/customui“
onLoad=”ribbonLoaded”>
在代码中(在文档里的VBA代码,或者在加载项中可能是Visual Basic代码或C#代码),添加一个过程如下:
IRibbonUI myRibbon;
public void ribbonLoaded(IRibbonUI ribbon)
{
myRibbon = ribbon;
}
IRibbonUI接口公开下面的方法。
表:IRibbonUI接口的方法
方法 动作 描述
Invalidate() 回调 导致所有自定义控件重新初始化
InvalidateControl(sting controlID) 回调 导致指定的控件重新初始化
装载图像
<customUI>元素的loadImage属性能使用户指定可以装载所有图像的回调。创建回调过程之后,office调作回调过程并为每个装载图像的控件传递图像属性字符串。不需要执行getImage回调多次,例如需要图像的每个控件都一次。某定制可能包括下面的标记:
<customUI XMLns=”http://schemas.microsoft.com/office/2006/01/customui“
loadImage=”GetImage”>
<!– Later in the markup –>
<button id=”myButton” image=”mypic.jpg” />
要提供按钮的图像,Office调用GetImage函数,传递参数“mypic.jpg”并随后接受IPictureDisp对象。通过使用该技术,可以编写返回定制需要的所有图像的单独的回调过程,而不需要必须编写每个单个控件的getImage回调。注意,在调用Ribbon的Invalidate方法或InvalidateControl方法时,不需再调用loadImage回调。对需要在运行时动态改变图像的控件,使用getImage回调。
例如,使用下面示例中的代码提供定制的图像。getImage回调方法必须返回stdole.IPictureDisp类型,因此通常需要转换图像为这种类型。在执行这些转换,可以使用下面的PictureConverter类,从AxHost类中继承。
Friend Class PictureConverter
Inherits AxHost Private Sub New()
MyBase.New(String.Empty)
End Sub
Public Shared Function ImageToPictureDisp( _
ByVal image As Image) As stdole.IPictureDisp
Return CType(GetIPictureDispFromPicture(image), _