资源描述
利用Application对象事件实现动态设定演示文稿放映内容
陈思敏 广东教育学院
【摘要】PowerPoint通过Application对象提供了作用于演示文稿、幻灯片和演示文稿窗口等非控件的对象的事件。但是对这些事件的编程与对其他标准控件的事件的编程不同,必须要先在类模块里用WithEvents关键字申明一个Application对象,并在另一个标准模块的初始化例程里实例化该类模块和Application对象,然后才能实现对Application对象的事件的编程。可以利用Application对象的幻灯片放映事件来实现在PowerPoint放映时动态设定放映内容。
【关键词】PowerPoint,Application对象,事件,演示文稿,动态设定,放映
【中图分类号】TP317.1
Setting PowerPoint’s Playing Contents Dynamically through Applying Events of Application Object
Simin Chen Guangdong Institute of Education
【Abstract】PowerPoint has provided events for such non-control objects as presentations, slides and windows. However, programming on these events is quite different from programming on the standard controls: programming on the events of application objects cannot be conducted until an application object has been declared with the key word WithEvents in a class module and this class module as well as its application object has been referenced in the initialization routine in a standard module. Setting the playing contents dynamically when the presentation is being played can be implemented through applying the playing events of the application object.
【Key Words】PowerPoint, Application Objects, Events, Presentation, Setting Dynamically, Playing
一、引言
开发过Microsoft Office解决方案的工程师们都知道,Word解决方案中除了可以给标准控件的事件编程之外,还可以给文档对象Document的三个事件编程:New、Open和Close,以便完成初始化或结束设置等工作。给Document对象的事件编程可以直接在给其他控件编程的代码窗口里完成,因为在这个窗口里可以找到Document对象。然而,在开发PowerPoint解决方案时,在给控件编程的代码窗口里却没有PowerPoint演示文稿对象Presentation,也没有幻灯片对象Slide,因此无法象Word解决方案那样直接给这些非控件对象编程,也就无法控制这些对象被操作时的动作,例如,采用时间控制的方式放映幻灯片时动态设定幻灯片的内容等。事实上PowerPoint提供了这些非控件对象的事件,只是对这些事件的编程与对普通控件的事件的编程方法不一样。本文将深入探讨在PowerPoint解决方案中对这些非控件对象的事件的编程方法,以及对这些事件的典型的应用例子。
二、PowerPoint的Application对象的事件
PowerPoint提供了三种非控件对象的事件,这三种非控件对象是演示文稿对象Presentation,幻灯片对象Slide,以及窗口对象Window。但是,虽然事件是针对这三种对象的,但从编程方法上来说,所有这些事件都属于Application(应用程序)对象的事件。根据事件发生的场合,这些事件可以分为两大类:在编辑幻灯片时发生的事件和在放映幻灯片时发生的事件。下表列出Microsoft Office PowerPoint 2003所提供的这类事件:
事件发生场合
事件
解释
编辑幻灯片
AfterNewPresentation
新演示文稿被创建后此事件发生
AfterPresentationOpen
演示文稿被打开后此事件发生
ColorSchemeChanged
幻灯片设计模板更改后此事件发生
NewPresentation
新演示被创建后此事件发生
PresentationBeforeSave
保存演示文稿前此事件发生
PresentationClose
关闭演示文稿时此事件发生
PresentationNewSlide
新建幻灯片时此事件发生
PresentationOpen
打开演示文稿时此事件发生
PresentationPrint
打印演示文稿前此事件发生
PresentationSave
保存演示文稿前此事件发生
PresentationSync
演示文稿与服务器上的副本进行同步时此事件发生
SlideSelectionChanged
选择另一幻灯片时此事件发生
WindowActivate
激活演示文稿窗口时此事件发生
WindowBeforeDoubleClick
双击对象后而双击效果出现前此事件发生
WindowBeforeRightClick
右键单击对象后而单击效果出现前此事件发生
WindowDeactivate
演示文稿窗口取消活动状态时此事件发生
WindowSelectionChange
演示文稿窗口中选取另一对象时此事件发生
放映幻灯片
SlideShowBegin
启动放映幻灯片时此事件发生
SlideShowEnd
结束放映幻灯片后此事件发生
SlideShowNextBuild
动画效果结束后此事件发生
SlideShowNextClick
单击切换到另一张幻灯片时发生此事件
SlideShowNextSlide
切换到另一张幻灯片时发生此事件
三、申明和实例化Application对象
由于上述的事件属于Application对象的事件,所以如果要为这些事件编程的话,必须先申明一个能捕获事件的Application对象。申明能捕获事件的Application对象的关键词是WithEvents。具体操作步骤如下:
1、插入一个类模块。由于该模块要被在另一个模块里的初始化例程引用,所以应该给该类模块一个有意义的名称。例如在下面的例子里该类模块被命名为appEvents。可以在对象属性窗口里完成改名操作。
2、在该类模块的通用段里申明一个能捕获事件的Application对象,对象名称用户自定,例如在下面的例子里该Application对象被命名为app:
Public WithEvents app As Application
3、申明了Application对象后,便可以为该对象的事件编程了。
4、在另一个模块里引用该模块并实例化Application对象。通常做法是插入一个通用模块,并在模块里创建一个初始化例程,然后在模块的通用段里申明一个包含Application对象及其事件编程的类模块,并在初始化例程里实例化该类模块和Application对象。例:
Dim nonControlEvents As appEvents
Public Sub Initialize()
Set nonControlEvents = New appEvents
Set nonControlEvents.app = Application
End Sub
四、应用Application对象的放映事件自动地动态设定放映内容
Application对象的事件可以应用于编辑幻灯片的时候,也可以应用于放映幻灯片的时候。本文以动态设定放映内容为例子来探讨Application对象的事件应用于放映幻灯片的场合。该例子可用来制作简单的照片浏览器。
操作步骤:
1)创建数据库:由于要动态设定放映内容,所以动态放映的内容应该存放在数据库里。在本例子里要动态设定的放映内容是一幅图片和一段文字说明,采用Microsoft Access数据库存放动态放映的内容。对数据库的设计和创建是先建立一个Microsoft Access数据库,命名为db.mdb,然后在数据库里添加一个名为item的数据表,在数据表里建立两个字段:fldPicture (Text, 50)和fldText (Text, 200),分别用于存放保存图片的路径及文件名和存放文字说明(对数据库的具体操作不在本文讨论范围)。
2)创建演示文稿:创建两张幻灯片,设置好版式以及固定的放映内容,并将放映方式设为“循环放映,按<ESC>结束”,幻灯片换片方式为“每隔3秒”,并取消单击鼠标换片。之所以要用两张幻灯片是因为要利用两张幻灯片之间的换片事件来动态改变放映内容。
3)创建模块:在VB编辑器里创建一个普通模块和一个类模块,按上述方法在类模块里申明一个Application对象和在普通模块里申明并引用类模块。如果要在普通模块的初始化例程里启动放映演示文稿,可以用演示文稿的幻灯片放映设置的Run方法来实现:
ActivePresentation.SlideShowSettings.Run
4)引用ADO库:在引用对话框里引用“Microsoft ActiveX Data Object 2.0 Library”。
5)编写放映事件的代码:在类模块里为Application对象的放映事件编写代码,实现动态设置放映内容。
Public WithEvents app As Application
Dim cn As New ADODB.Connection '申明并实例化一个ADO连接对象
Dim rs As New ADODB.Recordset '申明并实例化一个ADO记录集对象
Dim intCurrentSlide As Integer '用于记录正在放映的幻灯片序号
Dim shpPicture(1 to 2) As Shape '申明两个Shape对象放映图片
Dim shpText(1 to 2) As Shape '申明两个Shape对象放映文字说明
Dim intEntryEffect As Integer '存放幻灯片切换方式
'利用SlideShowBegin事件初始化放映设置
Private Sub app_SlideShowBegin(ByVal Wn As SlideShowWindow)
With cn
.Provider = "Microsoft.jet.oledb.4.0"
.Open (ActivePresentation.Path & "\db.mdb") '连接数据库
End With
With rs
.ActiveConnection = cn
.Open ("Select * from items"), , adOpenStatic '读取数据表记录
End With
intCurrentSlide = 1 '当前幻灯片序号为1
If Not rs.EOF Then '如果是空数据表,则不进行以下操作
'在第一张幻灯片上显示图片,位置是(Top = 10, Left = 10)
Set shpPicture(1) = ActivePresentation.Slides(1).Shapes _
.AddPicture(rs.Fields(1), msoCTrue, msoCTrue, 10, 10)
Set shpText(1) = ActivePresentation.Slides(1).Shapes _
.AddLabel(Orientation:=msoTextOrientationHorizontal, _
Left:=450, Top:=10, Width:=300, Height:=500) '实例化shpText(1)
shpText(1).TextFrame.TextRange.Text = rs.Fields(2) '显示文本
rs.MoveNext '记录指针下移
If rs.EOF Then rs.MoveFirst '若到记录表尽头,指针返回第一个记录
'对第二张幻灯片做同样操作
Set shpPicture(2) = ActivePresentation.Slides(2).Shapes _
.AddPicture(rs.Fields(1), msoCTrue, msoCTrue, 10, 10)
Set shpText(2) = ActivePresentation.Slides(2).Shapes _
.AddLabel(Orientation:=msoTextOrientationHorizontal, _
Left:=450, Top:=10, Width:=300, Height:=500)
shpText(2).TextFrame.TextRange.Text = rs.Fields(2)
rs.MoveNext
If rs.EOF Then rs.MoveFirst
End If
intEntryEffect = 2049 '设定幻灯片切换方式为"从左抽出"
End Sub
Private Sub app_SlideShowEnd(ByVal Pres As Presentation)
If Not rs.EOF Then
shpPicture(1).Delete '删除幻灯片的图片
shpPicture(2).Delete
shpText(1).Delete '删除幻灯片的文本
shpText(2).Delete
End If
rs.Close
Set rs = Nothing
cn.Close
Set cn = Nothing
End Sub
Private Sub app_SlideShowNextSlide(ByVal Wn As SlideShowWindow)
If intCurrentSlide = 1 Then '切换两张幻灯片序号
intCurrentSlide = 2
Else
intCurrentSlide = 1
End If
If intEntryEffect > 2057 Then '产生一个相对随机的幻灯片切换方式
intEntryEffect = Int(8 * Rnd + 2049)
Else
intEntryEffect = Int(5 * Rnd + 3857)
End If
ActivePresentation.Slides(intCurrentSlide).SlideShowTransition _
.EntryEffect = intEntryEffect '更改幻灯片切换方式
If Not rs.EOF Then '更改当前幻灯片上的图片和文本
shpPicture(intCurrentSlide).Delete
Set shpPicture(intCurrentSlide) = ActivePresentation _
.Slides(intCurrentSlide).Shapes.AddPicture(rs.Fields(1), _
msoCTrue, msoCTrue, 10, 10)
shpText(intCurrentSlide).TextFrame.TextRange.Text = rs.Fields(2)
rs.MoveNext
If rs.EOF Then rs.MoveFirst
End If
End Sub
五、结束语
在上述例子里,由于动态更换放映内容是自动实现的,所以要解决的主要问题是利用什么来驱动自动更换放映内容的发生。上述例子利用了Application对象的三个幻灯片放映事件:SlideShowBegin,SlideShowNextSlide,以及SlideShowEnd,完成了连接数据库和读取数据表、产生放映对象Shape,动态更换放映内容,并在放映结束时断开数据库连接,还原演示文稿等操作。
参考文献:
1、专著:Paul Lomax著,刘海明译,《VB与VBA技术手册》[M],中国电力出版社,2005年
2、专著:Taruna Goel, Rachna Chaudhary著,王晓娟,陈代川等译,《VBA专业项目实例开发》[M],中国水利水电出版社,2003年
3、专著:Microsoft公司著,《Desktop Application with Visual Basic 6.0》[M],北京大学出版社,2000年
4、Microsoft Office 2003帮助系统
(完)
展开阅读全文