使用加载项扩展窗体区域
尽管可以在不使用 COM 加载项的情况下创建和运行带有窗体区域的窗体,但是,使用 COM 加载项将允许在窗体区域中包括自定义业务逻辑或高级功能。 与在标准窗体中自定义表单页不同,不使用 VBScript 在窗体后面编写代码;而是使用 COM 加载项对窗体区域进行编程。 加载项将用来实现一个新接口: FormRegionStartup 。 加载项将能够在窗体区域中使用 Microsoft Forms 2.0 控件和 Microsoft Outlook 控件。 本主题描述如何在窗体区域中实现 FormRegionStartup 和访问 Outlook 控件。
指定加载项的用法
注册消息类的窗体区域时,在 Windows 注册表中为该邮件类创建一个键, (如果该键尚不存在) ,并将等号指定为数据, (=) 后跟加载项的 ProgID。 有关在 Windows 注册表中注册窗体区域的详细信息,请参阅 在 Windows 注册表中指定窗体区域。
实现 FormRegionStartup
在用来实现 COM 加载项的 IDTExtensibility2 接口的同一类中,实现在 Outlook 类型库中定义的 Outlook.FormRegionStartup 接口。 Outlook 将调用此接口中的以下四种方法:
GetFormRegionStorage
当 Outlook 要显示由加载项控制的窗体区域时,Outlook 将调用 GetFormRegionStorage 方法。 当加载项接收 Outlook 对 GetFormRegionStorage 的调用并为窗体区域指定信息时,加载项将返回布局的信息。 此信息可以是布局文件 (的本地路径。OFS 文件) 、Microsoft Windows IStorage 对象或包含 OFS 文件内容的字节数组,允许外接程序将 OFS 存储为资源。 Outlook 将使用所返回的信息来实例化控件并计算窗体区域的布局。 Outlook 还将实例化窗体区域的 FormRegion 对象。 在 Microsoft Visual Basic 和 Microsoft C# 中, GetFormRegionStorage 的方法原型如下所示。
在 Visual Basic 中:
Public Function GetFormRegionStorage(ByVal FormRegionName As String,
ByVal Item As Object,
ByVal LCID As Integer,
_ ByVal FormRegionMode As Outlook.OlFormRegionMode,
ByVal FormRegionSize As Outlook.OlFormRegionSize) _
Implements Microsoft.Office.Interop.Outlook.FormRegionStartup.GetFormRegionStorage
在 C# 中:
public object GetFormRegionStorage(string FormRegionName,
object Item,
int LCID,
Outlook.OlFormRegionMode FormRegionMode,
Outlook.OlFormRegionSize FormRegionSize)
BeforeFormRegionShow
如果 GetFormRegionStorage 成功,则在将窗体区域显示在检查器窗口或阅读窗格中之前,Outlook 将调用 BeforeFormRegionShow 并将 FormRegion 对象传递到加载项。 外接程序将在显示窗体区域之前使用此机会来更新用户界面中的任何内容,例如更改标签标题,如下面的 访问 Outlook 控件 部分中所述,并禁止显示不相关的内容。 BeforeFormRegionShow 方法的 Visual Basic 和 C# 原型如下所示。
在 Visual Basic 中:
Public Sub BeforeFormRegionShow(ByVal Item As Object,
ByVal FormRegion As Microsoft.Office.Interop.Outlook.FormRegion) _
Implements Microsoft.Office.Interop.Outlook.FormRegionStartup.BeforeFormRegionShow
在 C# 中:
public void BeforeFormRegionShow(object Item, Outlook.FormRegion FormRegion)
访问 Outlook 控件
在使用 COM 加载项扩展窗体区域时,您通常是在侦听控件事件、调用控件方法或者读取和设置控件属性。 若要访问 Microsoft Forms 2.0 控件、Outlook 控件或加载项中的窗体画布对象,则必须添加对 Microsoft Forms 2.0 对象库的引用。 添加此引用将使您能够访问加载项项目中的 Microsoft.Vbe.Interop.Forms 命名空间。
在添加该引用之后,可以选择为类型库的命名空间创建一个别名,从而更便于使用所包括的类型。 若要创建别名,请在代码文件的顶部插入以下代码。 下面的示例演示用 Visual Basic 或 C# 编写加载项时如何创建别名。 这些别名还将用在以下示例之后的代码示例中。
在 Visual Basic 中:
Imports Outlook = Microsoft.Office.Interop.Outlook
Imports Office = Microsoft.Office.Core
Imports MSForms = Microsoft.Vbe.Interop.Forms
在 C# 中:
using Outlook = Microsoft.Office.Interop.Outlook;
using Office = Microsoft.Office.Core;
using MSForms = Microsoft.Vbe.Interop.Forms;
可以通过从 BeforeFormRegionShow 获取的 FormRegion 对象访问控件。 FormRegion.Form 属性返回一个代表窗体的对象;可以将该对象转换为 MSForms.UserForm 类(在 Microsoft Forms 2.0 对象库中公开)以访问窗体区域的窗体画布。
UserForm 对象的每个实例都有一个 Controls 集合,该集合可用来按控件名称访问 UserForm 上的各个控件。 许多 Microsoft Forms 2.0 控件都具有应用了主题的相应 Outlook 控件。 在窗体区域中,Outlook 将那些具有 Outlook 相应控件的 Forms 2.0 控件替换为应用了主题的相应控件。 在获取了对 Controls 集合中应用了主题的控件的引用之后,可以将它转换为 Outlook 类型库中的适当类型。 然后,你将能够访问 Outlook 类型库中为这些控件公开的所有属性、方法和事件。 与使用 VBScript 自定义窗体不同,你将能够侦听所有控件事件,而不仅仅是 Click 事件。 有关控件的详细信息,请参阅自定义窗体中的控件。
以下代码示例演示 BeforeFormRegionShow 方法如何使用输入参数FormRegion 从 Outlook 获取表单对象,然后将其强制转换为 MSForms.UserForm 类并访问 UserForm 对象中的控件集合。 此 UserForm 对象表示的窗体画布有两个 Outlook 控件:一个名为 OlkTextBox1
的文本框和一个名为 的 OlkCheckBox1
复选框。 下面的代码示例将这两个控件转换为适当的 Outlook 控件类型并设置它们的默认值,如下所示。
在 Visual Basic 中:
Dim UserForm As MSForms.UserForm
Dim FormControls As MSForms.Controls
Dim TextBox1 As Outlook.OlkTextBox
Dim CheckBox1 As Outlook.OlkCheckBox
UserForm = FormRegion.Form
FormControls = UserForm.Controls
TextBox1 = FormControls.Item("OlkTextBox1")
TextBox1.Text = "Sample Form Region"
CheckBox1 = FormControls.Item("OlkCheckBox1")
CheckBox1.Value = True
在 C# 中:
MSForms.UserForm userForm = (MSForms.UserForm)FormRegion.Form;
MSForms.Controls formControls = userForm.Controls;
Outlook.OlkTextBox textBox1 =
(Outlook.OlkTextBox)formControls.Item("OlkTextBox1");
textBox1.Text = "Sample Form Region";
Outlook.OlkCheckBox checkBox1 =
(Outlook.OlkCheckBox)formControls.Item("OlkCheckBox1");
checkBox1.Value = true;
GetFormRegionManifest
Outlook 启动时,将从 Windows 注册表中读取窗体区域列表并缓存这些数据。 基于这些数据,如果 Outlook 发现某个加载项要为一个窗体区域提供 XML 清单,则 Outlook 将使用缓存数据中提供的 ProgID 并调用此加载项实现的 GetFormRegionManifest 方法,以获取其显示该窗体区域所需的 XML。 如果 XML 清单无效并且不符合窗体区域 XML 架构,则 Outlook 将无法加载窗体区域。
有关在注册窗体区域时指定 ProgID 的详细信息,请参阅在 Windows 注册表中指定窗体区域。
GetFormRegionManifest 方法的 Visual Basic 和 C# 原型如下所示。
在 Visual Basic 中:
Public Function GetFormRegionManifest(ByVal FormRegionName As String,
ByVal LCID As Integer) _
Implements Microsoft.Office.Interop.Outlook.FormRegionStartup.GetFormRegionManifest
在 C# 中:
public object GetFormRegionManifest(string FormRegionName, int LCID)
GetFormRegionIcon
当 Outlook 启动时,它会从 Windows 注册表中读取列表中的窗体区域并缓存的窗体区域相关联的数据。 如果窗体区域中注册一个 ProgID,Outlook 将借助相应外接程序通过调用 GetFormRegionIcon 其实现了 addin
作为 图标 元素的子元素的值的 XML 清单中的任何图标。 有关使用加载项指定图标的详细信息,请参阅操作方法:使用加载项指定窗体区域的图标。
GetFormRegionIcon 方法的 Visual Basic 和 C# 原型如下所示。
在 Visual Basic 中:
Public Function GetFormRegionIcon(ByVal FormRegionName As String,
ByVal LCID As Integer, _
ByVal Icon As Outlook.OlFormRegionIcon) _
Implements Microsoft.Office.Interop.Outlook.FormRegionStartup.GetFormRegionManifest
在 C# 中:
public object GetFormRegionIcon(string FormRegionName, int LCID, Outlook.OlFormRegionIcon Icon)
支持和反馈
有关于 Office VBA 或本文档的疑问或反馈? 请参阅 Office VBA 支持和反馈,获取有关如何接收支持和提供反馈的指南。