| Microsoft Visual Studio 2005 Tools for the Microsoft Office system (VSTO) 是一组强大的工具,其特点是允许开发人员使用 Visual Basic® 和 Visual C#® 来扩展和自定义 Microsoft® Office 应用程序。新版本的 VSTO 随 2007 Microsoft Office 系统一起发行。此新版本,即 Microsoft Visual Studio® 2005 Tools for the 2007 Microsoft Office system(称为 Visual Studio 2005 Tools for Office Second Edition 或 VSTO 2005 SE),为 Word、Excel®、Outlook®、PowerPoint®、Visio® 和 InfoPath® 添加了新功能。可免费下载获得并且可在 Visual Studio 2005 专业版或更高版本以及 VSTO 2005 之上安装。
通过 VSTO 2005 SE,您可以在加载项中自定义 2007 Microsoft Office 系统功能(包括功能区、自定义任务窗格和 Outlook 窗体区域)。VSTO 2005 SE 运行时库还添加了对 2007 Office 系统中现有 VSTO 2005 应用程序的支持。此外,它还可用于创建 Office 2003 加载项。
此新版本首次添加了对 PowerPoint 和 Visio 的支持。让我们看一下为这两个应用程序添加的支持,从而了解一下您如何才能轻松地创建绝妙的新应用程序。
PowerPoint 2007
在 VSTO 2005 SE 中添加对 PowerPoint 的支持是最常被要求添加的支持之一。使用 VSTO 加载项可以使许多任务(例如,生成和更新演示文稿)变得更容易。生成演示文稿的典型示例是,通过将幻灯片库(存储在服务器上)中的现有幻灯片串接起来创建新的演示文稿。其他常见情况还包括以编程方式创建新的幻灯片和利用当前数据更新现有幻灯片。我想为您介绍与创建和更新幻灯片关联的一些常见任务。请注意,此项讨论主要适用于 2007 Office 系统。
安装 VSTO 2005 SE 时,它将在 Visual Studio“新建项目”对话框的 Office 节点下添加两个文件夹(请参阅图 1):一个用于创建以 Office 2003 为目标的加载项,另一个用于创建以 2007 Office 系统应用程序为目标的加载项。让我们开始创建新的 PowerPoint 加载项,方法是选择“2007 加载项”文件夹中显示的“PowerPoint 加载项”模板。
![]() 0)this.src="/large";" alt="" src="http://i.msdn.microsoft.com/cc163471.fig01.gif">
图 1 VSTO 模板 (单击该图像获得较大视图)
PowerPoint 项目模板将创建一个名为 ThisAddIn 的类。您将看到两个事件:ThisAddIn_Startup 和 ThisAddIn_Shutdown。加载加载项时,将调用 ThisAddIn_Startup。(这是放置您的初始化代码的好地方。)卸载加载项时,将调用 ThisAddIn_Shutdown。(这是您应放置清理代码的地方。)
PowerPoint 2007 对象模型
PowerPoint 提供了您可用于创建加载项的丰富的对象模型。而且您无需了解整个对象模型就可以开始编程。
同在所有 Office 应用程序中一样,PowerPoint 的顶层对象也是 Application 对象,它代表整个 PowerPoint 应用程序。VSTO 编程模型使您可以轻松地访问此 Application 对象。键入 Me.Application 则会返回 PowerPoint.Application 类型。与共享加载项不同,无需将对象转换为正确的 Office Application 类型,因为 VSTO 项目模板为您正在创建的加载项设置了正确的类型。(例如,在 Word 加载项中调用 Me.Application 则会返回 Microsoft.Office.Interop.Word.Application 对象。)
Application 对象包含一个含有 Presentations 对象的 Presentation 集合。Presentation 对象(表示实际的 .ppt 文档)包含一个保存 Slide 对象(在您的演示文稿中,每个幻灯片对应一个 Slide 对象)的 Slides 集合。而且每个幻灯片都包含一个保存 Shape 对象的 Shapes 集合。Shape 对象是您在幻灯片中看到的项,例如,标题、文本框架和图表(请参阅图 2)。
![]() 0)this.src="/large";" alt="" src="http://i.msdn.microsoft.com/cc163471.fig02.gif">
图 2 PowerPoint 幻灯片中的 Shape 对象 (单击该图像获得较大视图)
创建演示文稿
您可以使用对 Application 对象的引用来创建一个新的 Presentation 并且将其添加到 Presentations 集合。首先,创建一个变量来保存对您将创建的新的 Presentation 对象的引用。然后,您需要做的是调用 Presentations 集合中的 Add 方法:
Dim presentation As PowerPoint.Presentation = _
Me.Application.Presentations.Add()
您可能想知道 PowerPoint 对象的来源。VSTO 项目模板自动将 Imports 别名添加命名空间 Microsoft.Office.Interop.PowerPoint。您可以通过查看 References 项目属性页面上的 Imported 命名空间来查看创建的其他引用和别名。
添加标题幻灯片
标题幻灯片(显示演示文稿的标题和子标题)通常是演示文稿中的第一个幻灯片。创建新的幻灯片同创建新的演示文稿类似。通过调用 AddSlide 方法,您可以将幻灯片添加到演示文稿的幻灯片集合。此方法使用两个参数:幻灯片索引(用于指定幻灯片在演示文稿中的插入位置)和 customLayout 对象。
您可以从 SlideMasterou 创建 customLayout 对象。SlideMaster 包含您希望出现在幻灯片中的所有对象。如您从以下代码中看到的一样,您可以从 PpSlideLayout 枚举选择布局类型:
Dim customLayout As PowerPoint.CustomLayout = _
presentation.SlideMaster.CustomLayouts.Item( _
PowerPoint.PpSlideLayout.ppLayoutTitle)
现在,您可以使用 AddSlide 方法创建新的幻灯片。使用幻灯片索引 1 来添加作为演示文稿中第一个幻灯片的幻灯片,然后传递您从 SlideMaster 创建的 customLayout 对象:
Dim slide as PowerPoint.Slide = _
presentation.Slides.AddSlide(1, customLayout)
现在创建了标题幻灯片,您可以使用一行代码来设置标题和子标题。您可以使用刚刚创建的幻灯片对象来获得 Shapes 集合的 Title 属性,以便返回作为幻灯片标题对象的 Shape 对象。提供 TextRange 对象的 Shape 对象带有返回 TextFrame 对象的 TextFrame 属性。您可以按以下方式设置 TextRange 对象的 Text 属性:
slide.Shapes.Title.TextFrame.TextRange.Text = "VSTO 2005 SE 摇滚"
除了没有子标题形状属性外,设置子标题的过程类似。在此例中,我知道子标题是幻灯片中的第二个形状,因此我可以通过形状索引来引用它:
slide.Shapes(2).TextFrame.TextRange.Text = _
"一个 OFFICE 开发故事"
添加项目符号幻灯片
接下来,您将希望添加另一个幻灯片,此幻灯片通常顶部有标题并且以项目符号列表作为主要内容。这是最常使用的幻灯片类型。为此,如先前部分那样创建一个新的幻灯片,但选择不同的 CustomLayout 类型:ppLayoutText。由于我希望标题幻灯片作为第一个幻灯片出现,因此我使用 1 作为标题幻灯片的幻灯片索引。要按顺序插入幻灯片(在最后一个现有幻灯片之后),您应计算现有幻灯片的数量:
Dim customlayout As PowerPoint.CustomLayout = _
presentation.SlideMaster.CustomLayouts.Item( _
PowerPoint.PpSlideLayout.ppLayoutText)
Dim slide as PowerPoint.Slide = _
presentation.Slides.AddSlide( _
presentation.Slides.Count + 1, customlayout)
设置演示文稿主题
2007 Office 系统的 Office 主题中的新功能允许您将预定义的样式应用于文档。主题将全局更改演示文稿的外观,包括字体、图形、颜色和效果。Word、Excel、PowerPoint 和 Outlook 都支持主题。主题在带有 .thmx 扩展名的 Theme 文件中定义,并且在所有支持的应用程序中共享。2007 Office 版本附带了一些默认的主题,它们位于 Office 安装路径下的 Document Themes 12 目录中。
您可以设置主题,方法是调用新的演示文稿对象方法:ApplyTheme。此方法使用一个参数 - .thmx 主题文件路径:
presentation.ApplyTemplate( _
"C:\Program Files\Microsoft Office\Document Themes 12\Civic.thmx")
创建功能区
功能区是新的 Office UI 的核心。替换了 Office 以前版本中的菜单和命令栏,功能区将特性和功能融入上下文相关的选项卡。选项卡包含许多组控件,例如按钮、图库和下拉列表。对于此项目,您将创建一个带有一个按钮的功能区,单击该按钮可创建新的演示文稿。VSTO 2005 SE 支持功能区扩展并且使得将新的自定义功能区选项卡和控件添加到应用程序变得非常容易。
首先,从“项目”|“添加新项”菜单将功能区支持项添加到您的项目。这将在您的项目中创建两个文件:一个用于功能区定义,另一个用于功能区源代码。功能区定义文件是描述功能区的 XML 文件。功能区源代码处理功能区加载和功能区事件。图 3 显示了添加功能区选项卡(名为“我的选项卡”)的简单功能区定义 XML 文件,其中包含一个名为“我的组”的组。此组仅包含一个名为“我的按钮”的按钮。此按钮有一个为 onAction 指定的名为 OnClick 的回调。
 Figure 3 简单的功能区定义 XML 文件
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui"
onLoad="OnLoad">
<ribbon>
<tabs>
<tab id="MyTab" label="我的选项卡">
<group id="MyGroup" label="我的组">
<button id="Button1" size="large" label="我的按钮"
screentip="我的按钮屏幕提示" onAction="OnClick"
imageMso="HappyFace" />
</group>
</tab>
</tabs>
</ribbon>
</customUI>
在自动创建的功能区定义中,为功能区的 onLoad 和按钮的 onAction 定义回调。您必须编辑在 Ribbon1 类中生成的方法以便处理这些回调。在添加功能区支持项时,创建 Ribbon1 类。Ribbon1 类实现 IRibbonExtensibility 接口(在请求时传递到 Office)。
Office 功能区使用服务请求模型,这意味着 Office 调用 RequestService 方法并且询问您是否有实现了 IRibbonExtensibility 接口的类。传递回 Ribbon1 类实例后,Office 将把此实例用于回调。
处理 RequestService 方法的代码已在添加功能区支持项时编写(只是取消了 Ribbon1 文件顶部的局部类代码注释)。然后编写处理回调的方法;您可以在 MSDN® 上找到所有功能区回调的回调签名文档。在 OnLoad 回调中,Office 传递对功能区实例的引用。您可以保存此引用以便在需要使功能区无效时使用。
使功能区无效是刷新功能区的唯一方法。使功能区无效时,Office 将重新调用需要呈现的功能区的所有回调。您还可以使单个控件无效以便进行更精确的处理:
Private ribbon As Office.IRibbonUI
Public Sub OnLoad(ByVal ribbonUI As Office.IRibbonUI)
Me.ribbon = ribbonUI
End Sub
在按钮的 OnClick 回调中,使用 Globals 类来获得对 ThisAddIn 类的引用。此外,调用 CreateNewPresentation 子程序来创建新的演示文稿并且执行所有步骤:
Public Sub OnClick(ByVal control As Office.IRibbonControl)
Globals.ThisAddIn.CreateNewPresentation()
End Sub
通过按 F5 注册加载项来运行解决方案并且启动 PowerPoint。然后,新的功能区将显示为右侧最后一个功能区选项卡,名为“我的选项卡”。
有关开发功能区的详细信息,请参阅此次发行的《MSDN 杂志》中有关此主题的 Eric Faller 的文章。
Visio 2007
Visio 长期以来一直支持自定义开发(通过支持 Visual Basic for Applications 和提供其自己的 SDK)。VSTO 2005 SE 通过创建托管 VSTO 加载项功能来扩展此功能。
Visio 解决方案有助于使您的数据可视化。例如,您可以使用数据库中的数据来用图表示您的计划时间线,或者,您可以使用 Active Directory 中由每位员工的销售数据覆盖的实际资料来创建组织机构图。让我们看一下 Visio 中为更大的应用程序奠定基础的基本任务。
由于具备了所有 VSTO 加载项,您可以创建新的 VSTO 加载项项目作为开始。而且,您可选择 Visio 2003 或 Visio 2007 为目标;我将使用 Visio 2007。VSTO 通过 ThisAddIn_Startup 和 ThisAddIn_Shutdown 事件处理程序来创建加载项,其过程与创建 PowerPoint 加载项的过程一样。
Visio 2007 对象模型
Visio 中的对象模型(与其他 Office 应用程序有很大不同)可能难于理解。幸运的是,对于此项目您无需理解整个对象模型,理解一些基本概念即可开始。
对于所有 Office 应用程序,对象模型的根为包含 Document 对象集合的 Application 对象。Document 是表示绘图的对象并且包含 Page 对象集合。每个 Page 对象则包含 Shape 对象集合。这些 Shape 对象是创建 Visio 应用程序的关键。
Shape 是您从模板投放在页面上的对象。模板(您可添加到绘图的 Visio 形状集合)包含在 .vss 文件中,并且可在 Visio 绘图左侧的容器中看到。
创建新的文档
通过调用 Document 集合中的 Add 方法来创建新的文档:
Dim newDocument As Visio.Document = Application.Documents.Add("")
这将返回一个 Visio.Document 对象实例。
创建文档时您可能还想设置某些其他属性。例如,设置纵向或横向布局以及文档的高度和宽度。上述设置对 Visio 文档来说很常见,因为Visio 文档可以非常大并且经常在绘图器上或在许多字体大小不同的页面上打印。
页面上有名为 PageSheet 的特殊形状,它是页面属性集合。这是需要理解的重要概念,因为它涉及如何设置所有 Visio 属性。属性存储在 Cell 对象中。有了对 Cell 的引用后,您可以设置由 Visio 计算以获得最终值的 Formula:
Dim page As Visio.Shape = newDocument.Pages(1).PageSheet
' 设置布局。
page.Cells("PrintPageOrientation").Formula = _
Visio.VisCellVals.visPPOPortrait
' 设置纸张大小。
page.Cells("PageWidth").Formula = "8.5 in"
page.Cells("PageHeight").Formula = "11.0 in"
添加形状
将形状添加到文档之前,您需要打开模板。在此情况下,您将打开基本模板。传递模板文件名和标记(例如,以只读方式打开并且停靠到应用程序窗口):
Stencil = Application.Documents.OpenEx( "BASIC_M.VSS", _
Visio.VisOpenSaveArgs.visOpenRO + _
Visio.VisOpenSaveArgs.visOpenDocked)
现在调用 Page 对象的 Drop 方法以便将形状添加到页面,同时传递 Master 对象(来自模板的 Masters 集合)以及您想要放置形状的 X 和 Y 位置:
Dim AddedShape As Visio.Shape = _
Application.ActiveWindow.Page.Drop( _
Stencil.Masters.ItemU("Square"), 2, 9)
然后,您可以自定义形状,例如添加在形状中显示的文本。同您设置文档属性时一样,您可以通过获得对 Cell 对象(包含属性)的引用来设置形状属性。然而,由于 Text 属性很常见而直接添加到 Shape 对象中,因此您无需使用 Cell 对象来设置文本:
您将多次添加形状,因此我强烈建议您将以下代码重构为单独的方法:
Public Function AddShape(ByVal ShapeName As String, _
ByVal X As Double, ByVal Y As Double) As Visio.Shape
' 通过模板向文档添加新形状。
Dim AddedShape As Visio.Shape = _
Application.ActiveWindow.Page.Drop( _
Stencil.Masters.ItemU(ShapeName), X, Y)
Return AddedShape
End Function
现在,添加多个形状变得很容易。下面是添加正方形和三角形以及设置每个形状的文本的示例:
' 添加一个正方形。
shape1 = AddShape("正方形", 2, 9)
shape1.Text = "形状 1"
' 添加一个三角形。
shape2 = AddShape("三角形", 2, 6)
shape2.Text = "形状 2"
对于 Visio 绘图,0,0 表示页面底部左侧。因此,在此示例中正方形被放在距左侧两英寸且距底部九英寸的位置上。
连接形状
在 Visio 中,您可通过连接形状来使关系和数据流可视化。连接形状的几条线实际上是形状本身。因此,您可以使用与添加形状相同的模式来添加这些连接线:
Dim connector As Visio.Shape = AddShape("动态连接器", 4, 4)
connector.Text = "Shape1 到 Shape2"
要将三角形连接到正方形(位于三角形之上),首先要定义两个 Cell 对象来保存对连接点属性的引用。您使用 ShapeConnectionPoint(形状上的点)和 ConnectorEndPoint(连接线上的点):
Dim ShapeConnectionPoint As Visio.Cell
Dim ConnectorEndPoint As Visio.Cell
Shape2 是您先前创建的三角形,而三角形的顶点属性名为 Connections.X4。连接器为动态连接器形状,而 EndX 为线底端的属性名称。
ShapeConnectionPoint = shape2.Cells("Connections.X4")
ConnectorEndPoint = connector.Cells("EndX")
然后,将单元格粘合在一起以便将线与形状连接:
ConnectorEndPoint.GlueTo(ShapeConnectionPoint)
由于三角形有三个连接点,因此它容易连接。正方形有四个连接点(分别在各个角上)。将形状放到页面时您会看到这些点(显示为蓝色的小 X)。您只能粘合连接点。因此,如果想要连接到图形的其他部分(比方说,正方形的底线),您必须添加新的连接点。图 4 显示了有助于实现上述目标的辅助方法。
 Figure 4 AddConnectionPoint 辅助方法
Public Function AddConnectionPoint( _
ByVal shape As Visio.Shape) As Visio.Cell
Dim newConnectionPointIndex As Integer
Dim newConnectionPoint As Visio.Row
newConnectionPointIndex = shape.AddRow( _
Visio.VisSectionIndices.visSectionConnectionPts, _
Visio.VisRowIndices.visRowLast, _
Visio.VisRowTags.visTagCnnctPt)
'获取对新连接点的引用。
newConnectionPoint = shape.Section( _
Visio.VisSectionIndices.visSectionConnectionPts) _
.Row(newConnectionPointIndex)
'在形状底部的中点创建连接点。
With newConnectionPoint
.Cell(Visio.tagVisCellIndices.visCnnctX).FormulaU = "Width*0.5"
.Cell(Visio.tagVisCellIndices.visCnnctY).FormulaU = "Height*0"
.Cell(Visio.tagVisCellIndices.visCnnctDirX).FormulaU = 0.0#
.Cell(Visio.tagVisCellIndices.visCnnctDirY).FormulaU = 1.0#
.Cell(Visio.tagVisCellIndices.visCnnctType).FormulaU = _
Visio.tagVisCellVals.visCnnctTypeInward
End With
Return shape1.Cells("Connections.X" & newConnectionPointIndex + 1)
End Function
现在,为了用直线将正方形的直线连接到三角形顶部(如 图 5 所示),通过以下代码在正方形的底线中部添加新的连接点。
ShapeConnectionPoint = AddConnectionPoint(shape1)
ConnectorEndPoint = connector.Cells("BeginX")
ConnectorEndPoint.GlueTo(ShapeConnectionPoint)
![]() 0)this.src="/large";" alt="" src="http://i.msdn.microsoft.com/cc163471.fig05.gif">
图 5 在 Visio 2007 中创建文档 (单击该图像获得较大视图)
AddConnectionPoint 辅助方法添加了一个新的连接点并且返回 Cell 对象。可以通过添加新的属性或行来添加新的连接点,因为 Visio 在内部将属性存储为列表。添加行后,可以设置公式值。到目前为止,多数公式都包括单个值。在这种情况下,公式通过 Width*0.5 来动态计算底线中心位置。最后,此方法将返回刚创建的连接点的 Cell 实例。
添加背景页面
在 Visio 中,背景页面允许添加您想要显示在多个页面之后的文本或形状(例如,标题和图例)。背景页面是 Background 属性设置为 1(表示 true)的普通页面。您可以通过设置 BackPage 属性将背景页面与另一页面关联起来:
Dim backgroundPage As Visio.Page = _
Application.ActiveDocument.Pages.Add()
backgroundPage.Name = "TheBackground"
backgroundPage.Background = 1 'True
Application.ActiveDocument.Pages(1).BackPage = backgroundPage.Name
要将文本添加到背景页面,从矩形创建形状对象,通过传递字体索引值来设置形状的字体属性,然后设置 Characters 对象文本以设置将显示在形状中的文本。如图 6 所示。
 Figure 6 将文本添加到背景页面
' 创建一个文本框形状。
Dim textBox As Visio.Shape
textBox = Application.ActiveWindow.Page.DrawRectangle( _
1.0, 10.0, 3.0, 10.5)
textBox.TextStyle = "Normal"
textBox.LineStyle = "Text Only"
textBox.FillStyle = "Text Only"
' 设置字体。
fontIndex = Application.ActiveDocument.Fonts("Arial Black").ID
textBox.Cells("Char.Font").Formula = fontIndex
' 设置文本。
Dim textBoxText As Visio.Characters
textBoxText = textBox.Characters
textBoxText.Begin = 0
textBoxText.End = 0
textBoxText.Text = "VSTO 2005 SE 摇滚"
设置文档主题
同在 PowerPoint 中一样,您可以在 Visio 中设置预定义的主题。实际上,您可以在多数 Office 应用程序中设置相同的主题。然而,Visio 的一个不同之处在于,您可以使用 VisThemeColors 枚举来指定主题。指定值的方法有很多。例如,您可以将值指定为字符串或整数。Visio 的另一个不同之处在于,您可以分别指定主题颜色和主题效果。从 ActivePage,您可以分别使用 Theme Colors 和 Theme Effects 属性来控制这些设置:
Application.ActivePage.ThemeColors = _
Visio.VisThemeColors.visThemeColorsCivic
Application.ActivePage.ThemeEffects = _
Visio.VisThemeEffects.visThemeEffectsPillow
创建 Commandbar
显然,您需要一种启动创建绘图的子程序的方法。Visio 不支持功能区,因此您需要为此加载项使用 Commandbar。(在 Visio 2003 及其他 Office 2003 应用程序中,未对此代码进行更改。)图 7 显示了用于创建 Commandbar 以及添加带有笑脸图标按钮控件的代码。您可以在图 5 中看到此按钮。最终的结果是将正方形连接到三角形并应用主题,如图 5 所示。
 Figure 7 创建 Commandbar
Dim commandBars As Office.CommandBars
Dim commandBar As Office.CommandBar
commandBars = Application.CommandBars
commandBar = commandBars.Add("Demo Toolbar", _
Office.MsoBarPosition.msoBarTop, , True)
' 当工具栏可见时设置上下文。
commandBar.Context = Visio.VisUIObjSets.visUIObjSetDrawing & "*"
' 添加带有笑脸图标的按钮。
DemoButton = _
commandBar.Controls.Add(Office.MsoControlType.msoControlButton)
DemoButton.Tag = "演示按钮"
DemoButton.FaceId = 2950
DemoButton.TooltipText = "运行演示"
总结
作为可免费获得的 Visual Studio 专业版或更高版本的附件,VSTO 2005 SE 允许您为六种最常用的 Office 应用程序创建应用程序。它还可以确保现有的 VSTO 2005 应用程序在迁移到 2007 Office 系统后仍然能够工作。无论您使用 Office 2003 还是 2007 Office 系统,VSTO 2005 SE 提供了创建绝妙的 Office 加载项的简便方法。 |