吴 锋
摘 要:本文应用VBA语言,提出了在PowerPoint中制作导航菜单的设计思路和实现方法,并详述了关键技术,从而为高水平课件的制作提供指导。
关键词: VBA;PowerPoint;导航菜单
中图分类号:G433 文献标识码:A 文章编号:1673-8454(2009)16-0066-03
一、VBA简述
Visual Basic For Applications(VBA)是微软在其开发的应用程序中共享的通用自动化语言。它本身由应用程序控制,同时又反过来增强应用程序的功能。这种功能的实现通过宏来完成。宏是由一系列命令和指令组合而成的命令集,其本质是VBA代码组成的程序。
在PowerPoint中宏的使用、创建和运行方法参见文献。[1],[2] 宏代码的编写可以参考以下三种途径:
(1)执行“工具/宏/录制新宏”命令,在弹出的“录制新宏”对话框中设置宏名,再点击“确定”按钮。这时,PowerPoint将处于录制状态, 它能将手工操作记录下来并转换为相应的代码。通过编辑修改记录下来的VBA代码,有助于快速构造VBA实用程序。
(2)执行“工具/宏/宏”或“工具/宏/Visual Basic 编辑器”命令,然后按F1查看Microsoft PowerPoint Visual Basic参考。
(3)进入微软官方帮助和支持网站,[3],[ 4] 更详细地掌握VBA对象的属性和方法。
二、设计思路
导航菜单的实现主要按照如下几步展开设计:
1.菜单的设计
菜单的设计包括主菜单和子菜单在显示组件上的选择、外观上的设计以及文本的添加等。在显示组件的选择上,主、子菜单一律使用绘图工具栏上的“自选图形格式/基本形状”中的矩形作为元素。虽然主(子)菜单也可以采用一行(列)包含不同主菜单项的表格,但是为了用VBA确定对象的名称,从而明确地控制各个对象,所以我们不使用表格创建菜单。然后对菜单的外观,如自选图形的填充颜色、透明度、线条的颜色、线条的样式、线条的粗细等进行选择。最后,再给菜单加上相应的文字。
2.菜单位置的设定
矩形菜单是以自选图形为元素的,所以菜单在幻灯片中的参考位置是幻灯片的左上角。首先可以利用PageSetup对象中的SlideWidth和SlideHeight命令获得和设置幻灯片页面的宽度和高度;其次,利用Top、Left、Width、Height来设置主菜单、子菜单的位置及它们的宽度和高度。这样就实现了对菜单在幻灯片中位置的精确控制。
3.子菜单显隐效果的制作
子菜单显隐效果的制作分三个部分。第一,当鼠标滑入指定对象,显隐效果的制作可以直接利用ActionSettings集合对象中的ActionSetting(ppMouseOver),它表示在幻灯片放映中用户将鼠标滑入指定对象时的反应。利用上述命令可以指定在幻灯片放映中鼠标移过某形状时执行宏命令,并在宏命令中用Visible将菜单设置为可见或不可见,这样就实现了菜单的显隐。第二,当鼠标滑出指定对象时,因为PowerPoint中VBA语言没有命令响应该动作,所以这是显隐效果制作最关键的一步。为了在鼠标滑出时执行相应的宏且不影响幻灯片的显示效果(例如,在窗口添加图片时,图片能够照样显示),在菜单的周围布满完全透明的矩形框,且将其置为顶层,然后分别利用ActionSetting(ppMouseOver)给每个矩形框添加隐藏子菜单的宏命令,只要鼠标在这些矩形框上移动,则触发已经编好的隐藏子菜单的宏命令的执行,从而达到在鼠标滑出指定对象时隐藏子菜单的目的。第三,为了能对处于普通视图状态下的幻灯片的子菜单内容进行编辑,在Visual Basic编辑器窗口执行“插入/类模块”声明对象变量,结合SlideShowEnd命令实现在幻灯片结束时显示所有子菜单,并利用SlideShowBegin实现在幻灯片放映时隐藏所有子菜单。
4.超链接的添加
使用 Hyperlink可以将子菜单的每个矩形框分别链接到目标对象,并与其他目标对象(例如,连接到上一章幻灯片)进行自由切换。同样的,我们也可以给文字添加超链接,届时文字底部将会出现下划线(艺术字除外)。
三、主要实现代码
为了利于VBA代码的编写、调试和运行,在Visual Basic 编辑器状态下的工程中,我们添加多个模块,每个模块完成特定的功能。在菜单栏上选择“视图/属性窗口”可以给定每个模块取一个有意义的名称。主要模块1-6的宏名分别为:main、prime_menu、New_submenu1、New_submenu2、Aroundshape_Rec、add_Mcrolink。模块1实现调用并执行其它模块的功能;模块2主要是建立主菜单;模块3和模块4分别用来建立与不同的主菜单相对应的子菜单;模块5用来在菜单的周围添加透明矩形框;模块6用来给主菜单添加宏,控制菜单的显示和隐藏,并设置子菜单和透明矩形框在 Z顺序中的位置——即指定所指定形状相对于其他形状是在其上层还是在其下层。为了简化叙述过程且不失一般性,以建立一个分别包含一个子菜单的两个主菜单为例进行阐述,如图1。下面给出主要实现代码。
1.主菜单的建立
Sub prime_menu()'添加主菜单1和2
Set Slide_index = ActivePresentation.Slides(1) '激活第一张幻灯片
Dim i As Integer
For i = 1 To 2
'oTop, oLeft, oHeight, oWidth为全局变量, 在模块1中定义和赋值
With Slide_index.Shapes.AddShape(Type:=msoShapeRectangle, _
Top:=oTop, Left:=oLeft + (i - 1) * oWidth, Width:=oWidth, Height:=oHeight)
.Name = "menu" & i '命名新建图形
.Fill.ForeColor.RGB = RGB(255, 0, 0) '设定填充颜色
.Line.ForeColor.RGB = RGB(255, 255, 0)'设定线的颜色
End With
Next
'给主菜单1和2添加文本
For Each sh In Slide_index.Shapes
If sh.Type = msoAutoShape Then
If sh.Name = "menu1" Then sh.TextFrame.TextRange.InsertAfter "menu1"
If sh.Name = "menu2" Then sh.TextFrame.TextRange.InsertAfter "menu2"
End If
Next
End Sub
2.给主菜单添加宏
Sub add_Mcrolink()
Dim i As Integer
Dim Around_Rec As Variant
Set Slide_index = ActivePresentation.Slides(1)
'鼠标移过主菜单1时运行宏menu1_Over
With Slide_index.Shapes("menu1").ActionSettings(ppMouseOver)
.Action = ppActionRunMacro
.Run = "menu1_Over"
.AnimateAction = True
End With
ActiveWindow.Selection.Unselect
End Sub
3.控制子菜单的显示和隐藏
Sub menu1_Over()
Set Slide_index = ActivePresentation.Slides(1)
Set myShape = Slide_index.Shapes("menu1")
'鼠标滑过主菜单1时发出打字机的声音
myShape.ActionSettings(ppMouseOver).SoundEffect.Name = "打字机"
'鼠标滑过主菜单1时,显示主菜单1的子菜单,隐藏主菜单2的子菜单
Slide_index.Shapes("submenu2").Visible = msoFalse
Slide_index.Shapes("submenu1").Visible = msoTrue
Slide_index.Shapes("submenu1").ZOrder msoBringToFront '置于最顶层
End Sub
4.启动幻灯片放映时发生的事件
Dim myobject1 As New 类1
Sub StartEvents()
Set myobject1.App1 = Application
End Sub
在新建类模块1中输入如下代码:
Public WithEvents App1 As Application
Private Sub App1_SlideShowBegin(ByVal Wn As SlideShowWindow)
Set Slide_index = ActivePresentation.Slides(1)
Slide_index.Shapes("submenu2").Visible = msoFalse
Slide_index.Shapes("submenu1").Visible = msoFalse
End Sub
完整的代码在Windows XP操作系统、Microsoft Office PowerPoint 2003下编写,并顺利运行通过。
四、结束语
在导航菜单所在页中还可以加入图片、背景色、声音等元素,丰富幻灯片的效果。需要指出的是,在幻灯片中添加的图片需要置于透明矩形框的下一层,这样播放幻灯片才能使鼠标触发透明矩形框。
参考文献:
[1]程智.用VBA来提高PowerPoint制作的课件交互性[J]. 中国电化教育, 2002, (6): 52-53.
[2]吴良海.宏在PPT课件模板实时切换中的应用[J]. 中国教育信息化, 2008, (6): 32-33.
[3]http://office.microsoft.com/zh-cn/default.aspx [DB/OL].
[4]http://msdn.microsoft.com/en-us/office/default.aspx[DB/OL].
(编辑:隗爽)