论文部分内容阅读
摘 要:在剖析PowerPoint VBA绘图方法以及Windows MIDI API函数的基础上,提出了利用VBA在幻灯片中直接绘制交互式物理图像,并根据物理参数实时控制物体运动、实时产生交互式背景音效的方法,从而为制作高性能交互式物理模拟课件提供了一条有效的途径。文中就有关方法及关键技术做了介绍,并给出了具体实例。
关键词:VBA编程;实时交互;PowerPoint绘图;交互式音效;物理模拟课件
中图分类号:G434文献标识码:A 文章编号:1673-8454(2008)16-0057-04
PowerPoint由于其简单易用及兼容性好等优点成为广大教师制作课件的首选工具。但是,因为它不是专业的软件开发工具,用常规手段制作的课件也就是一篇演示文稿,交互性不强,显得比较呆板,这些因素致使许多教师在制作人机交互式物理模拟课件时不得不知难而退或选择其它开发工具。
笔者经过反复思考和探索找到了在PowerPoint中利用VBA制作交互式物理模拟课件的有效途径,既解决了在幻灯片中直接绘制交互式物理图像的问题,还实现了用交互方式实时控制物体的运动、由MIDI函数和物理参数实时产生交互式背景音效的方法,这种方法巧妙地将编程语言的灵活性和PowerPoint的优点有机地结合起来,制作出的物理模拟课件不仅简单实用,而且特色鲜明、效果极佳,现就有关制作方法及关键技术介绍如下,希望能对各位同仁有所启发。
一、PowerPoint VBA综述
1.关于VBA
在微软的Office家族中集成了一种加强Office功能的语言,即Visual Basic for Application,简称为VBA。VBA是Visual Basic程序设计语言(简称为VB)的一个子集,继承了VB的绝大多数功能,并包含了对PowerPoint对象的支持与操作功能,因此,易于掌握并用于宏编程。利用VBA使用者可以在幻灯片中添加控件等用户接口元素,通过这些控件应用程序可以得到用户的请求,并对其做出响应。在PowerPoint中适当地使用VBA,可以制作出交互性很强的模拟课件,为加强教学课件的演示效果开辟了广阔的空间。
2.VBA的特点
尽管VBA是VB的一个子集,具有与VB相近的开发环境,但在应用中与VB还是有一定的差异。VB是独立的应用程序开发工具,用其开发的应用程序可以独立运行;而VBA是嵌入PowerPoint的宏开发工具,用其开发的宏程序采用解释方式执行,而且宏程序是PowerPoint演示文稿的组成部分,必须在PowerPoint的支持下才能运行。
3.VBA宏编程的方法
跟VB类似,VBA也是面向对象的程序设计语言,采用的是事件驱动的编程机制。因此,宏的编制与VB编程一样,也是从对象的定义开始的。不过,与VB的通用对象不同,PowerPoint中除Application对象外,其它对象均未定义事件,无法驱动宏。因此,除了Application对象,可以产生宏驱动事件的对象仅限于VBA所支持的诸如命令按钮、文本框、图片框等VB通用控件对象,这些对象均包含在“控件工具箱”工具栏。在幻灯片中添加所需的控件对象,右击对象或选择“控件工具箱”中的“属性”就可以设置该对象的有关属性,双击对象可以打开VBA开发环境,开始编程,其间的操作与VB基本相同。
4.宏程序的启动方式
为了防范宏病毒对计算机的侵害,在PowerPoint的“工具”菜单中对宏的安全性设置了相应的安全级,只有将安全级设置成“低”或“中”,重新打开相应的PPT文件,并在系统提示的“安全警告”对话框中选择“启用宏”(当安全级设置成“中”时会出现此对话框),才能在幻灯片放映时启动宏程序,看到相应效果。
二、在幻灯片中绘制交互式物理图像的方法
1.PowerPoint中的绘图方法
PowerPoint中的绘图方法非常有限,只提供了两种绘制直线的方法:
(1)使用Shapes集合对象的AddLine 方法,格式为:
Shapes.AddLineBeginX,BeginY,EndX,EndY
其中,BeginX、BeginY和EndX、EndY是直线起始点和终止点的坐标,均为Single类型的必选参数,以磅为单位。
用这种方法所绘制的直线是一个Shapes对象,就跟手工绘制的直线一样在幻灯片中一直存在;如需交互式绘制,则必须使用其它函数将这个对象删除,故不适于交互式函数图形的绘制。
(2)使用SlideShowView对象的DrawLine方法,格式为:
SlideShowWindows(1).View. Draw Line BeginX,BeginY,EndX,EndY
有关参数的要求和作用跟上面相同。
DrawLine方法实际上是模拟幻灯片中的绘图笔来进行绘图,绘制的图形只是在幻灯片上进行显示而没有在幻灯片中形成Shapes对象,不须另行处理,在幻灯片进行切换后就不会再显示该图形,如果需要还可以用EraseDrawing方法将所绘制的图形清除;此外,所绘图线的颜色可以用PointerColor属性进行灵活设置。因此用这种方法最适合绘制静态和动态物理图像。
2.在幻灯片中绘制交互式物理图像的基本思想
借助控件工具箱可以给幻灯片添加文本框、滚动条、组合框、列表框等用户接口控件,在幻灯片放映时通过这些控件可为有关物理模型提供实时的物理参数,并根据物理模型所对应的数学表达式计算出有关物理量,从而绘制出交互式的物理图像。
值得一提的是DrawLine方法绘制的图线为直线,若想绘制逼真的物理图像必须采用折线逼近的思想,即将曲线(物理图像)细分成若干小段,每一小段用直线代替,当所分的小段足够小就可以使所绘制的折线图形非常接近于曲线,幻灯片放映时完全可以达到以假乱真的效果。
具体做法是:若绘制的物理图像所对应的函数曲线是x=f(t),y=g(t),参数t一般为时间,则先定义两个Single类型的数组x和y,其元素的个数为拟观测的抽样点的个数,这个数也就是曲线被切分的小段总数再加1。然后通过循环让t从最小值(第一个观测点所对应的t)变化到最大值(最后一个观测点所对应的t),根据函数形式f(t)、g(t)计算出每一个t对应的x和y,并将结果存放到两个数组。最后通过循环顺序访问两个数组,以x(i)、y(i)和 x(i 1)、y(i 1)作为直线的两个端点坐标,用DrawLine方法进行绘制即可。
跟VB类似,PowerPoint中默认的坐标系的原点位于屏幕的左上角,水平向右为X轴的正方向,垂直向下为Y轴的正方向,这跟我们习惯的迪卡尔坐标系有所不同。若想将Y轴的原点放在距屏幕上边界距离为L的位置,且向上为Y轴的正向,则必须进行坐标系的平移和变换,具体算法是:y’= L-y。
三、用交互方式实时控制对象运动要解决的关键问题
因为PowerPoint的特殊性及工具箱中提供的控件数量有限,在制作交互式模拟课件时有两个问题需要通过特殊途径来解决。
1.如何计时
用交互方式实时控制对象运动或绘制动态的物理图像,需要每隔一段时间调整一次物体的位置或计算一次有关物理量,因此如何准确计时就显得尤为关键。在VB等软件开发工具中都有计时器控件Timer可供开发者使用,但在PowerPoint中没有,能否解决这一难题是制作模拟课件的关键。笔者经过探索找到了两种不同的方法可以弥补这一缺陷:
方法1:用Windows中的API函数
利用Win32API中的定时器函数SetTimer()与KillTimer()。这种方法比较麻烦,需要在标准模块中声明这两个繁琐的API函数,并编写相应的定时器事件处理子程序。
方法2:用VBA自带的Timer函数
Timer函数返回的是一个单精度类型的时刻值(从子夜开始的秒数),测出两个时刻即可算出经历的时间。在代码中用一闲置循环进行等待,等到设定的时间后再执行后续代码,这种方法巧妙而又简单。如计时(等待)0.1秒就可用以下程序段:
T = Timer
While Timer – T < 0.1
DoEvents
Wend
闲置循环中用DoEvents语句的目的是在等待期间可以将控制权交给系统,以顾及其它任务或请求。
2.如何确定对象的名称
代码中不可避免地要引用有关控件或对象的名称,但是只有从“控件工具箱”中添加的控件才能在属性窗口中查到其名称,对于从绘图工具栏中绘制的各种自选图形以及“插入”菜单中插入的文本框、图片和表格等对象其名称便无从得知。
获取名称的唯一方法是针对这些对象录制一段临时宏,然后在宏代码中去查找。具体操作过程如下:
(1)先将有关对象添加至幻灯片,然后打开“工具/宏”菜单中的“录制新宏”对话框,使用默认宏名并单击“确定”,此时会出现一个“停止录制”的浮动工具栏,表明已进入宏录制状态。
(2)在幻灯片中调整该对象的位置或大小,然后单击浮动工具栏中的“停止录制”,结束宏录制。
(3)打开“工具/宏”菜单中的“宏”对话框,选中相应的宏名并单击“编辑”后即可进入宏代码窗口,此时在代码中就可以查看到该对象的名称。
(4)将录制的这段临时宏删除。
四、实时产生交互式背景音效的方法
MIDI是乐器数字接口的缩写,计算机的声卡中包含一个MIDI兼容的合成器,通过调用Windows MIDI API函数可以直接发送消息至合成器,从而产生相应的音效。有关MIDI输入输出的API函数主要有三个,这三个函数是低级MIDI API函数,其中midiOutOpen()函数用于打开设备,midiOutClose()函数用于关闭设备,midiOutShortMsg()函数用于传递MIDI输出消息,其第2个参数直接决定音效的内容,用速度、位移、时间等有关物理量控制该参数中的第2个字节的内容(数值左移8位,也就是乘以256即可移到第2个字节)就能实现用物理量控制MIDI消息,从而产生由物理量控制的交互背景音效。限于篇幅,其它参数不再详述,请参照本文实例中的用法。
五、制作实例
下面以斜抛运动为例,介绍在PowerPoint中制作交互式物理模拟课件的过程。
本课件要实现的功能是:动态模拟斜抛运动的全过程,抛射的初速度和抛射角度可通过滚动条调节,其数值既在标签中显示,又通过有向线段的长短及方位的变化形象地展示;当调节初始参数时飞行轨迹也动态出现在幻灯片中并随参数而变化;抛射过程中有音效伴随,音频随飞行时间而变化,抛射后既可看到物体在空中的飞行,又可看到组合框中滚动显示的即时飞行参数;单击“轨迹”按钮可随时查看飞行轨迹。运行效果如图1所示。
1.添加对象
(1)插入一张空白幻灯片,通过“视图/工具栏”菜单打开“控件工具箱”和“绘图”这两个工具栏。
(2)通过“控件工具箱”在幻灯片下方添加一个命令按钮作为地平面,在属性窗口中将“名称”属性改成“地面”,并将其Enabled属性设置成False。
(3)在“地面”左侧添加一个滚动条用于控制初速度Vo,将“名称”属性改成“速度”,并将Max属性设置成80(最大初速度)。
(4)在速度滚动条旁边再添加一个滚动条用于控制抛射角β,将“名称”属性改成“角度”,并将Max属性设置成90(最大抛射角)。
(5)在“地面”中央添加两个命令按钮用于控制抛射和查看飞行轨迹,将“名称”属性分别改成“抛射”和“轨迹”。
(6)在“地面”右侧添加一个组合框用于记录和滚动显示飞行参数,将“名称”属性改成“参数记录”。
(7)在滚动条上方添加一个标签用于显示Vo和β的值,将“名称”属性改成“显示参数”。
(8)通过“绘图”工具栏在“地面”左上方画一个红色立体小球,对应抛射物。
(9)选中“绘图”工具栏中的“箭头”,以小球为起点画一个白色的箭头,对应抛射角的射线。
2.确定对象名称
为了便于阅读程序,通过“控件工具箱”添加的控件名称已按“见名知意”的原则在属性窗口中做了更改,而通过绘图工具栏绘制的小球和射线,要借助上面介绍的“录制新宏”的方法确定名称。按照本文介绍的顺序添加有关对象,其名称分别为Shapes("Oval 2") 和Shapes("Line 13")。
3.编写宏代码
在幻灯片中双击按钮或滚动条等对象进入宏编辑窗口,并输入以下完整代码:
Private Declare Function midiOut Open Lib "winmm.dll" (lphMidi Out
关键词:VBA编程;实时交互;PowerPoint绘图;交互式音效;物理模拟课件
中图分类号:G434文献标识码:A 文章编号:1673-8454(2008)16-0057-04
PowerPoint由于其简单易用及兼容性好等优点成为广大教师制作课件的首选工具。但是,因为它不是专业的软件开发工具,用常规手段制作的课件也就是一篇演示文稿,交互性不强,显得比较呆板,这些因素致使许多教师在制作人机交互式物理模拟课件时不得不知难而退或选择其它开发工具。
笔者经过反复思考和探索找到了在PowerPoint中利用VBA制作交互式物理模拟课件的有效途径,既解决了在幻灯片中直接绘制交互式物理图像的问题,还实现了用交互方式实时控制物体的运动、由MIDI函数和物理参数实时产生交互式背景音效的方法,这种方法巧妙地将编程语言的灵活性和PowerPoint的优点有机地结合起来,制作出的物理模拟课件不仅简单实用,而且特色鲜明、效果极佳,现就有关制作方法及关键技术介绍如下,希望能对各位同仁有所启发。
一、PowerPoint VBA综述
1.关于VBA
在微软的Office家族中集成了一种加强Office功能的语言,即Visual Basic for Application,简称为VBA。VBA是Visual Basic程序设计语言(简称为VB)的一个子集,继承了VB的绝大多数功能,并包含了对PowerPoint对象的支持与操作功能,因此,易于掌握并用于宏编程。利用VBA使用者可以在幻灯片中添加控件等用户接口元素,通过这些控件应用程序可以得到用户的请求,并对其做出响应。在PowerPoint中适当地使用VBA,可以制作出交互性很强的模拟课件,为加强教学课件的演示效果开辟了广阔的空间。
2.VBA的特点
尽管VBA是VB的一个子集,具有与VB相近的开发环境,但在应用中与VB还是有一定的差异。VB是独立的应用程序开发工具,用其开发的应用程序可以独立运行;而VBA是嵌入PowerPoint的宏开发工具,用其开发的宏程序采用解释方式执行,而且宏程序是PowerPoint演示文稿的组成部分,必须在PowerPoint的支持下才能运行。
3.VBA宏编程的方法
跟VB类似,VBA也是面向对象的程序设计语言,采用的是事件驱动的编程机制。因此,宏的编制与VB编程一样,也是从对象的定义开始的。不过,与VB的通用对象不同,PowerPoint中除Application对象外,其它对象均未定义事件,无法驱动宏。因此,除了Application对象,可以产生宏驱动事件的对象仅限于VBA所支持的诸如命令按钮、文本框、图片框等VB通用控件对象,这些对象均包含在“控件工具箱”工具栏。在幻灯片中添加所需的控件对象,右击对象或选择“控件工具箱”中的“属性”就可以设置该对象的有关属性,双击对象可以打开VBA开发环境,开始编程,其间的操作与VB基本相同。
4.宏程序的启动方式
为了防范宏病毒对计算机的侵害,在PowerPoint的“工具”菜单中对宏的安全性设置了相应的安全级,只有将安全级设置成“低”或“中”,重新打开相应的PPT文件,并在系统提示的“安全警告”对话框中选择“启用宏”(当安全级设置成“中”时会出现此对话框),才能在幻灯片放映时启动宏程序,看到相应效果。
二、在幻灯片中绘制交互式物理图像的方法
1.PowerPoint中的绘图方法
PowerPoint中的绘图方法非常有限,只提供了两种绘制直线的方法:
(1)使用Shapes集合对象的AddLine 方法,格式为:
Shapes.AddLineBeginX,BeginY,EndX,EndY
其中,BeginX、BeginY和EndX、EndY是直线起始点和终止点的坐标,均为Single类型的必选参数,以磅为单位。
用这种方法所绘制的直线是一个Shapes对象,就跟手工绘制的直线一样在幻灯片中一直存在;如需交互式绘制,则必须使用其它函数将这个对象删除,故不适于交互式函数图形的绘制。
(2)使用SlideShowView对象的DrawLine方法,格式为:
SlideShowWindows(1).View. Draw Line BeginX,BeginY,EndX,EndY
有关参数的要求和作用跟上面相同。
DrawLine方法实际上是模拟幻灯片中的绘图笔来进行绘图,绘制的图形只是在幻灯片上进行显示而没有在幻灯片中形成Shapes对象,不须另行处理,在幻灯片进行切换后就不会再显示该图形,如果需要还可以用EraseDrawing方法将所绘制的图形清除;此外,所绘图线的颜色可以用PointerColor属性进行灵活设置。因此用这种方法最适合绘制静态和动态物理图像。
2.在幻灯片中绘制交互式物理图像的基本思想
借助控件工具箱可以给幻灯片添加文本框、滚动条、组合框、列表框等用户接口控件,在幻灯片放映时通过这些控件可为有关物理模型提供实时的物理参数,并根据物理模型所对应的数学表达式计算出有关物理量,从而绘制出交互式的物理图像。
值得一提的是DrawLine方法绘制的图线为直线,若想绘制逼真的物理图像必须采用折线逼近的思想,即将曲线(物理图像)细分成若干小段,每一小段用直线代替,当所分的小段足够小就可以使所绘制的折线图形非常接近于曲线,幻灯片放映时完全可以达到以假乱真的效果。
具体做法是:若绘制的物理图像所对应的函数曲线是x=f(t),y=g(t),参数t一般为时间,则先定义两个Single类型的数组x和y,其元素的个数为拟观测的抽样点的个数,这个数也就是曲线被切分的小段总数再加1。然后通过循环让t从最小值(第一个观测点所对应的t)变化到最大值(最后一个观测点所对应的t),根据函数形式f(t)、g(t)计算出每一个t对应的x和y,并将结果存放到两个数组。最后通过循环顺序访问两个数组,以x(i)、y(i)和 x(i 1)、y(i 1)作为直线的两个端点坐标,用DrawLine方法进行绘制即可。
跟VB类似,PowerPoint中默认的坐标系的原点位于屏幕的左上角,水平向右为X轴的正方向,垂直向下为Y轴的正方向,这跟我们习惯的迪卡尔坐标系有所不同。若想将Y轴的原点放在距屏幕上边界距离为L的位置,且向上为Y轴的正向,则必须进行坐标系的平移和变换,具体算法是:y’= L-y。
三、用交互方式实时控制对象运动要解决的关键问题
因为PowerPoint的特殊性及工具箱中提供的控件数量有限,在制作交互式模拟课件时有两个问题需要通过特殊途径来解决。
1.如何计时
用交互方式实时控制对象运动或绘制动态的物理图像,需要每隔一段时间调整一次物体的位置或计算一次有关物理量,因此如何准确计时就显得尤为关键。在VB等软件开发工具中都有计时器控件Timer可供开发者使用,但在PowerPoint中没有,能否解决这一难题是制作模拟课件的关键。笔者经过探索找到了两种不同的方法可以弥补这一缺陷:
方法1:用Windows中的API函数
利用Win32API中的定时器函数SetTimer()与KillTimer()。这种方法比较麻烦,需要在标准模块中声明这两个繁琐的API函数,并编写相应的定时器事件处理子程序。
方法2:用VBA自带的Timer函数
Timer函数返回的是一个单精度类型的时刻值(从子夜开始的秒数),测出两个时刻即可算出经历的时间。在代码中用一闲置循环进行等待,等到设定的时间后再执行后续代码,这种方法巧妙而又简单。如计时(等待)0.1秒就可用以下程序段:
T = Timer
While Timer – T < 0.1
DoEvents
Wend
闲置循环中用DoEvents语句的目的是在等待期间可以将控制权交给系统,以顾及其它任务或请求。
2.如何确定对象的名称
代码中不可避免地要引用有关控件或对象的名称,但是只有从“控件工具箱”中添加的控件才能在属性窗口中查到其名称,对于从绘图工具栏中绘制的各种自选图形以及“插入”菜单中插入的文本框、图片和表格等对象其名称便无从得知。
获取名称的唯一方法是针对这些对象录制一段临时宏,然后在宏代码中去查找。具体操作过程如下:
(1)先将有关对象添加至幻灯片,然后打开“工具/宏”菜单中的“录制新宏”对话框,使用默认宏名并单击“确定”,此时会出现一个“停止录制”的浮动工具栏,表明已进入宏录制状态。
(2)在幻灯片中调整该对象的位置或大小,然后单击浮动工具栏中的“停止录制”,结束宏录制。
(3)打开“工具/宏”菜单中的“宏”对话框,选中相应的宏名并单击“编辑”后即可进入宏代码窗口,此时在代码中就可以查看到该对象的名称。
(4)将录制的这段临时宏删除。
四、实时产生交互式背景音效的方法
MIDI是乐器数字接口的缩写,计算机的声卡中包含一个MIDI兼容的合成器,通过调用Windows MIDI API函数可以直接发送消息至合成器,从而产生相应的音效。有关MIDI输入输出的API函数主要有三个,这三个函数是低级MIDI API函数,其中midiOutOpen()函数用于打开设备,midiOutClose()函数用于关闭设备,midiOutShortMsg()函数用于传递MIDI输出消息,其第2个参数直接决定音效的内容,用速度、位移、时间等有关物理量控制该参数中的第2个字节的内容(数值左移8位,也就是乘以256即可移到第2个字节)就能实现用物理量控制MIDI消息,从而产生由物理量控制的交互背景音效。限于篇幅,其它参数不再详述,请参照本文实例中的用法。
五、制作实例
下面以斜抛运动为例,介绍在PowerPoint中制作交互式物理模拟课件的过程。
本课件要实现的功能是:动态模拟斜抛运动的全过程,抛射的初速度和抛射角度可通过滚动条调节,其数值既在标签中显示,又通过有向线段的长短及方位的变化形象地展示;当调节初始参数时飞行轨迹也动态出现在幻灯片中并随参数而变化;抛射过程中有音效伴随,音频随飞行时间而变化,抛射后既可看到物体在空中的飞行,又可看到组合框中滚动显示的即时飞行参数;单击“轨迹”按钮可随时查看飞行轨迹。运行效果如图1所示。
1.添加对象
(1)插入一张空白幻灯片,通过“视图/工具栏”菜单打开“控件工具箱”和“绘图”这两个工具栏。
(2)通过“控件工具箱”在幻灯片下方添加一个命令按钮作为地平面,在属性窗口中将“名称”属性改成“地面”,并将其Enabled属性设置成False。
(3)在“地面”左侧添加一个滚动条用于控制初速度Vo,将“名称”属性改成“速度”,并将Max属性设置成80(最大初速度)。
(4)在速度滚动条旁边再添加一个滚动条用于控制抛射角β,将“名称”属性改成“角度”,并将Max属性设置成90(最大抛射角)。
(5)在“地面”中央添加两个命令按钮用于控制抛射和查看飞行轨迹,将“名称”属性分别改成“抛射”和“轨迹”。
(6)在“地面”右侧添加一个组合框用于记录和滚动显示飞行参数,将“名称”属性改成“参数记录”。
(7)在滚动条上方添加一个标签用于显示Vo和β的值,将“名称”属性改成“显示参数”。
(8)通过“绘图”工具栏在“地面”左上方画一个红色立体小球,对应抛射物。
(9)选中“绘图”工具栏中的“箭头”,以小球为起点画一个白色的箭头,对应抛射角的射线。
2.确定对象名称
为了便于阅读程序,通过“控件工具箱”添加的控件名称已按“见名知意”的原则在属性窗口中做了更改,而通过绘图工具栏绘制的小球和射线,要借助上面介绍的“录制新宏”的方法确定名称。按照本文介绍的顺序添加有关对象,其名称分别为Shapes("Oval 2") 和Shapes("Line 13")。
3.编写宏代码
在幻灯片中双击按钮或滚动条等对象进入宏编辑窗口,并输入以下完整代码:
Private Declare Function midiOut Open Lib "winmm.dll" (lphMidi Out