一、Animation控件
Animation控件主要用于显示动画,如.avi文件等。该控件只能播放无声的AVI文件。此外,Animation控件只能播放未压缩的或巳用行程编码压缩的.avi文件。如果尝试加载含有声音数据或格式不为控件所支持的.avi文件,则返回错误信息(错误35752)。
注:.avi文件是Microsoft支持的一种视频文件格式,用于保存动画、电影片段等内容。
(一)添加Animation控件
1. 工程→部件→Microsoft Windows Common Contrls -2 6.0
2. 从工具箱中选择Animation
(二)Animation控件外观
图 12-1 Animation控件
(三)作用
显示无声的AVI视频文件,播放无声动画。
(四)ANIMATION控件的常用属性
AutoPlay:在将.avi文件加载到Animation控件时,该属性决定Animation控件是否开始自动播放.avi文件。
True 表示要自动连续循环播放.avi文件。
False 表示在加载了.avi文件后,需要使用Play方法来播放该.avi文件。
(五)ANIMATION控件的常用方法
1. Open
作用:用于打开一个要播放的.avi文件
格式: <对象名>.Open <文件名>
例如:播放当前应用程序路径之下的文件filedel.avi:
Animation1.Open App.Path & "\filedel.avi"
2. Play
作用:用于播放已经打开的.avi文件
格式: <对象名>.Play [<重复次数>],[<起始帧>][,<结束帧>]
例如:Animation1.Play 5, 3, 15
播放当前打开的.avi文件的第3帧到第15帧,共播放5遍。
3.Stop
作用:终止那些用Play方法启动的动画。
格式:<对象名>.Stop
当设置Autoplay属性为True时不能使用Stop方法终止播放。
4. Close
作用:关闭当前打开的.avi文件。
格式: <对象名>.Close
(六)应用举例
【例12.1】在窗体上放四个命令按钮,单击各按钮时实现打开特定的.avi文件、播放动画、停止播放和关闭动画。界面如图:
图12-2 例12.1设计界面
各命令按钮的Click事件过程如下:
Private Sub Command1_Click() ' “打开”按钮
Animation1.Open App.Path & "\filedel.avi"
End Sub
Private Sub Command2_Click() ' “播放”按钮
Animation1.Play
End Sub
Private Sub Command3_Click() ' “停止”按钮
Animation1.Stop
End Sub
Private Sub Command4_Click() ' “关闭”按钮
Animation1.Close
End Sub
图12-3 例12.1设计界面
二、ActiveMovie控件
可视动画控件ActiveMovie是microsoft公司的控件,从不成熟的1.0、1.2到2.0,每次都有了很大的改进,如1.0版本中有几个属性是只读的(例如,displaymode只能为amvtime,而不能改为amvframes)。该控件支持音频文件(.wav、.mid、.rmi)、影片文件(.avi、.mov、.mmm、.mpeg、.mpg、.mpa、.mpv)和vcd文件(.dat)等。播放时若用鼠标右键单击画面,则可以直接对画面的播放、暂停、停止等进行控制,读者还可以自行在“属性”栏中对影片播放进行控制设置,诸如设置“播放次数”、“音量”、“影片大小(1/16、1/4、1/2、1、2倍和全屏”、“面板”、“颜色”、“过滤器”等。这种技术的实现实际上是vb调用activemovie控制器来完成的,而activemovie控制器内嵌了microsoft mpeg音频解码器和microsoft mpeg视频解码器。
(一)添加ActiveMovie控件
右键单击工具箱,会弹出一个小窗口,单击部件,(见图12-4)
图12-4 添加ActiveMovie控件
在屏幕正中会出现一个部件对话框,这里陈列着许多未在工具箱中列出的控件。我们需要添加一个ActiveMovie控件。点击滚动条,找到Microsoft ActiveMovie Control,单击复选框选定。 (见图12-5)
如果没有发现这个控件,那么单击浏览。(见图12-5)选取Amovie.ocx。单击打开,(见图12-6)会出现部件对话框,找到Microsoft ActiveMovie Control,单击确定。
图12-5 部件对话框
图12-6 部件对话框
工具箱上会新增一个小图标,这代表着ActiveMovie控件已经添加。(见图四)
图12-7 ActiveMovie控件已添加
(二)ActiveMovie控件常用属性和方法
Duration: 所选文件的播放总时间(单位:秒),通过此属性值可以得到所播放的视频文件从开始播放到结束播放所需的时间,所以利用此项值和前面介绍的CurrentPosition属性可以得到已播长度和总长度之间的关系,从而为播放器加上进度条。
---- MovieWindowSize: 播放窗口的尺寸。此属性有六种值可选,分别为原始尺寸、二倍原始尺寸、二分之一屏幕、四分之一屏幕、六分之一屏幕、最大尺寸(满屏)。使用者可以根据需要选择。
---- Volume: 播放时声音的大小。注:此属性值只能为0或负值。为0时,音量最大,值越小音量越小。例如当Volume=-400时的音量小于Volume=-100时的音量。利用此属性值可以为播放器加上音量旋钮。
---- SelectionStart: 所要播放文件的开始播放点。(单位:秒)例如:此属性值若赋为10,则播放时从第十秒处开始播放,前十秒则被跳过。但要注意此属性值一定要大于所播文件的总长度,即要小于Duration的值。此属性缺省值为0。
---- SelectionEnd: 所要播放文件的结束播放点。(单位:秒) 当文件播放到此长度时就停止播放。此属性值要大于SelectionStart的值,而小于Duration的值。缺省值为文件总长度Duration。
---- PlayCount: 所播放文件循环播放的次数。例如:当ActiveMovie.PlayCount=3时,所播放的文件循环播放三次后才停止。
---- 还有许多属性读者可以亲自试一下。运用ActiveMovie控件,可以很容易的实现视频文件的播放控制,并且,ActiveMovie控件可以支持多种文件格式的播放,如:dat,mpg,mov和.wav等。通过在窗体上加入图片或背景,改变按钮形状等方法,读者可以设计出自己满意的播放器,不妨试一试。
【例12.2】制作一个屏保程序
制作一个你所喜爱的屏幕保护。首先使我们的这个屏保程序的窗体是全屏的。
将Form1的WindowState属性设置为2,它的功能是在程序运行时,使窗体为全屏。 (见图12-8)
图12-8 ActiveMovie控件已添加
将ActiveMovie1的AutoSize属性设置为True,它的功能是在程序运行时,使窗体为原大。
为使在屏幕保护运行中鼠标不可见,需要改动代码。点击查看代码按钮。关闭工具箱并将代码设计窗口适当放大,以便输入程序代码。
在通用_声明区键入以下代码:
Private Declare Function SetCursorPos Lib "user32" (ByVal X As Long, ByVal Y As Long) As Long
Option Explicit(见图12-9)
在Form_Load 中键入代码:
Dim ret
On Error Resume Next
ActiveMovie1.FileName = App.Path & "\3.mpg"
ret = SetCursorPos(2000, 2000)
If App.PrevInstance = True Then
Unload Me
Exit Sub
End If ActiveMovie1.Left = Screen.Width / 2 - ActiveMovie1.Width / 2
ActiveMovie1.Top = Screen.Height / 2 - ActiveMovie1.Height / 2
(见图12-10)
图12-10 代码窗口
再键入以下代码:
这代码的功能是防止屏幕保护程序重复执行。
为实现在按任意键或点击以及移动鼠标后退出屏幕保护,我们首先将Form1的KeyPreview设为Ture。
为使按任意键后程序退出,我们在Form_KeyDown中添加代码。 键入end。
为使单击鼠标后程序退出,我们在Form_MouseDown中添加代码。 键入end。
为使移动鼠标后程序退出,我们在Form_MouseMove中添加代码:
Static s_xx, s_yy As Single
Dim m_ax, m_ay As Single
m_ax=X
m_ay=Y
If s_xx=0 And s_yy=0 Then
s_xx=m_ax
s_yy=m_ay
Exit Sub
End If
If Abs(m_ax-s_xx)>1 Or Abs(m_ay-s_yy)>5 Then
End
End If
为使这段动画能够循环播放,在ActiveMovie1_PositionChange中改变一下代码。将下面两行用'注释掉。
'MsgBox ("谢谢观赏!")
'End ActiveMovie1.FileName = App.Path & "\3.mpg"
下面将这段代码进行编译。注意,为使编译出的文件成为屏幕保护程序,要在”工程1"后加上扩展名“.scr”。(见图12-11)
图12-11 保存对话框
三、Multimedia MCI 控件
设计多媒体程序,关键是对多种媒体设备的控制和使用, 一种方法是使用微软公司窗口系统中对多媒体支持的MCI,即媒体控制接口,MCI是多媒体设备和多媒体应用软件之间进行设备无关的沟通的桥梁。在Visual Basic 3.0以后的版本中,MCI都得到了很好的支持。
(一)什么是MCI
MCI(Multimedia Control Interface)是微软Windows定义的多媒体接口标准,MCI 接口包括了CDAudio(激光唱机)、Scanner(图像扫描仪)、VCR(磁带录像机)、Videodisc(激光视盘机)、DAT(数字化磁带音频播放机)、DigitalVideo(窗口中的数字视频)、Overlay(窗口中的模拟视频叠加设备)、MMMovie(多媒体影片演播器)、Sequencer(MIDI音序设备)、WaveAudio(波形音频设备)、Other(未定义的MCI设备)等多媒体的主要产品,支持环境是Windows 3.1及Windows 95以后各版本。
MCI的最大优点是应用系统与设备无关性,对于标准多媒体设备,安装相应的Windows的MCI Driver,Windows即可对该设备进行操作访问;对于非标准的多媒体设备,只要有厂家提供所配的MCI Driver也一样可以操作。由于MCI与设备的无关性,程序员在多媒体应用系统的开发中,无需了解每种产品细节,就能开发出通用的多媒体应用系统。那么在VB中如何使用MCI呢?它是通过VB控件提供的功能来实现的。
(二)添加Multimedia MCI控件
要在程序中使用MCI控件,应首先将其添加到工具箱中,方法是:通过Project(工程)菜单的Components(部件)菜单项选择Microsoft Multimedia Control6.0(mci32.ocx)文件(如图12-12所示)
图 12-12 “部件”对话框
把该控件添加到工具箱中,添加后的工具箱如图12-13所示。
图 12-13 工具箱
下图所示就是MCI控件。在工具箱中单击该控件,在窗体上创建该工具的命令条界面。Multimedia MCI控件由一系列命令按钮组成,当打开了有效的多媒体设备并且控件可用时,这些按钮会自动完成工作。
图 12-14 MCI控件
这些命令按钮与通常的CD机或录像机上的命令(功能)很相似。如图12-6所示,从左到右的9个按钮依次为Prev(倒带)、Next(快进)、Play(播放)、Pause(暂停)、Back(回倒)、Step(步进)、Stop(停止)、Record(录音)、和Eject(弹碟)。你可以为某一个按钮编写程序,从而为其增加特殊功能,但一般情况,缺省的按钮功能就能很好地播放音乐和视频。
每个按钮的名称和功能,见表12-1。
表12-1各按钮功能表
按键名称 |
功 能 |
Previous |
前一个曲目或者音轨 |
Next |
下一个曲目或者音轨 |
Play |
开始播放媒体文件 |
Pause |
暂停播放媒体文件 |
Back |
单步退回 |
Step |
单步前进 |
Stop |
停止播放 |
Record |
录制声音、视频 |
Eject |
CD盘、磁带等弹出 |
●AutoEnable属性
决定Multimedia MCI控件是否能够自动启动或关闭控件中的某个按钮。如AutoEnabled属性设置为True,Multimedia MCI控件就启用指定MCI设备类型在当前模式下所支持的全部按钮。这一属性还会禁用那些MCI设备类型在当前模式下不支持的按钮。它的值可以为:
False:不能启用或禁用按钮;
True:(缺省值)自动启用功能可用的按钮,禁用功能不可用的按钮。
●Enabled属性
布尔值,决定控件的各个按钮是否可使用。这一属性允许在运行时启用或禁用MCI控件。它的值可以设置为:
False:控件中的所有按钮均被禁用(淡化显示);
True:(缺省值)控件被启用
●ButtonEnabled属性
布尔值。决定是否启用或禁用控件中的某个按钮(禁用的按钮以淡化的形式显示)。它的值可以设置为:
False:(缺省值)禁用(淡化)Button所指定的按钮。这个按钮的功能在控件中是不可用的;
True:启用Button所指定的按钮。这个按钮的功能在控件中是可用的。
表12-2 三个属性间的关系
Enabled |
AutoEnabled |
ButtonEnabled |
False |
无效 |
无效 |
True |
True |
无效 |
False |
True有效 | |
False有效 |
决定指定的按钮是否在控件中显示。
●DeviceType属性
在使用Multimedia MCI控件中的按钮之前,你必须用控件的DeviceType属性打开一个有效的多媒体设备。
典型地,在Form_Load事件过程中放入程序代码就可以实现这项任务。这样,当程序启动时,系统就会自动配置该控件。然而,如果你想要同一控件管理几个不同的多媒体设备,也可以在程序运行过程中,动态修改DeviceType属性。
DeviceType属性的语法为:MMControl1.DeviceType=DevName其中DevName是一个字符串值,代表一个有效的设备类型。例如,指定能播放WaveAudio文件的设备,应指定下面的字符串:MMControl1.DeviceType="WaveAudio"
下表列出了Multimedia控件支持的多媒体设备。
表12-3多媒体设备类型
设备类型 |
DeviveTyep |
文件类型 |
说明 |
Cdaudio |
Cdaudio |
音频CD播放器 | |
Digital Audieo |
Dat |
数字音频设备 | |
Digital Video |
Digital Video |
窗中的数字视频 | |
Other |
Other |
未定义MCI设备 | |
Overlay |
Overlay |
视频重叠设备 | |
Scanner |
Scanner |
图像扫描仪 | |
Sequencer |
Sequencer |
.mid |
音箱设备数据接口 |
Vcr |
VCR |
可程序控制录像机 | |
AVI |
AVIVideo |
.avi |
视频文件 |
Videodisc |
Videodisc |
激光视盘播放器 | |
Wavaudio |
Wavaudio |
.wav |
播放数字波形文件的音频文件 |
在用DeviceType属性标识了程序中想要使用的设备之后,就可以开始用Command属性把MCI命令发送给该设备。要发送的命令与Multimedia MCI控件上各按钮的名称一致:Prev,Next,Play,Pause,Back,Step,Stop,Record和Eject。另外,还可以向控件发送一些通用MCI命令,包括Open,Close,Sound,Seek,和Save。
使用MCI命令的好处是:发送命令时,你不需要对正在使用的多媒体设备有太多的了解。例如,你不需要知道存储在CD-ROM驱动器上的数据是怎样命令设备开始播放的。
系统提供了14个控制命令,如表12-4。
表12-4控制命令
属性 |
功能描述 |
属性 |
功能描述 |
Close |
关闭一个多媒体设备 |
Play |
播放 |
Open |
打开一个多媒体设备 |
Pause |
暂停 |
Save |
保存打开的设备文件 |
Back |
后退 |
Seek |
寻找To属性指定的位置 |
Step |
步进 |
Sound |
播放声音 |
Stop |
停止 |
Previous |
回到当前轨道的起点 |
Record |
开始记录 |
Next |
转到下一条轨道的起点 |
Eject |
弹出光盘 |
下面的语句使用Multimedia MCI控件的Command属性在已经打开的多媒体设备上进行播放:
MMControl1.Command="play"
●FileName属性
指定Open命令将要打开的或者Save命令将要保存的文件名称。如果在运行时要改变FileName属性,就必须先关闭然后再重新打开MCI控件。
●Frames属性
规定step命令向前单步或Back命令向后单步的帧数。在设计时,该属性不可用。
●From属性
为Play或Record命令规定起始点。在设计时,该属性不可用。
●hWndDisplay属性
对于利用窗口显示输出结果的MCI,MMMovie或Overlay设备,为其规定显示输出的窗口。在设计时,该属性不可用。
●Mode属性
返回已打开的多媒体设备的状态。在设计时,该属性不可用,在运行时,它是只读的。表12-5列出了MCI的Mode属性值。
表12-5 Mode属性值含义
返 回 值 |
含 义 |
524 |
设备没有打开 |
525 |
设备停止 |
526 |
设备正在播放 |
527 |
设备正在记录 |
528 |
设备正在搜索 |
529 |
设备暂停 |
530 |
设备准备好 |
属性规定打开的MCI设备上的媒体长度。在设计时,该属性不可用,在运行时它是只读的。
●Orientation属性
设定控件中的按钮是水平排列还是垂直排列。当该值为0时,水平排列,该值为1时垂直排列。
●Position属性
该属性指定打开的MCI设备的当前位置。在设计时,该属性不可用,在运行时,它是只读的。
●Tracks属性
该属性传回所使用的多媒体设备有多少个音轨。以CD唱片而言,Tracks这个属性表示一张光盘中,一共有多少首歌曲。
●Start属性
该属性指定当前媒体的起始位置。在设计时该属性不可用,在运行时,它是只读的。
●To属性
该属性规定Play或Record命令的结束点,在设计时,该属性不可用。
●UpdateInterval属性
表示产生StatusUpdate事件的频率,以微秒为单位。
(四)Multimedia MCI控件的常用事件和方法
MCI控件的常见事件如表12-6所示。
表12-6 MCI常用事件
事 件 |
事件描述 |
ButtonClick |
鼠标单击按钮 |
ButtonCompleted |
按钮动作完成 |
ButtonGotFocus |
按钮获得焦点 |
ButtonLostFocus |
按钮失去焦点 |
StatusUpdate |
更新MCI对象的状态报告 |
鼠标单击MCI控件上的某个按钮后放开则触发该事件每一个ButtonClick事件都是在执行一个MCI指令,如果ButtonClick事件被触发,VB会先执行事件过程中的程序步骤,再执行预定的MCI指令。至于参数Cancel,如果我们在事件过程中,将Cancel设为True,则当ButtonClick事件被触发时,就不会执行预定的MCI指令,而是照着我们自定的程序去执行。
●ButtonCompleted事件
MCI控件上按钮的MCI控制命令执行时,触发该事件。
要注意的是,如果在ButtonClick事件发生时,其参数Cancel设为True,则ButtonCompleted事件将不会被触发
●StatusUpdate事件
按UpdateInterval属性所给定的时间间隔自动地触发:这一事件允许应用程序更新显示,以通知用户当前MCI设备状态。
表12-6 NotifyCode设置值
值 |
设置值 |
描述 |
1 |
MciSuccessful |
命令成功的执行 |
2 |
MciSuperseded |
命令被其它命令替代 |
4 |
MciAborted |
命令被用户中断 |
8 |
MciFailure |
命令失败 |
当Notify属性为True的MCI命令结束时发生。
它的语法:Private Sub MMControl Done (NotifyCode As Integer)参数NotifyCode表示MCI命令是否成功。可以是左表任意设置值
(四)应用举例
【例12.3】在启动时播放包含一首歌曲或一个音频格式的.wav文件
(1)程序界面设计
1) 在File(文件)菜单中,单击New Project(新建工程)菜单项,然后单击OK(确定)按钮。
2)在“工程”菜单中选择“部件”菜单项,在“部件”对话框中,选中“Microsoft Multimedia Control6.0”部件(MCI控件包含在这个部件中),使它显示在工具箱中;
3)在属性窗口中把窗体的Caption设置为“Welcome to Playtune”;这里为了将窗体设计成欢迎界面,设置了picture属性,并添加了Label标签显示Welcome字样;
4)在窗体中间添加一个MCI控件,名称为MMControl1,DeviceType属性设成WaveAudio,其它属性采用默认值;.
5)除了设置这些必不可少的属性外,还设置了另外几个属性,注意这些属性不是在属性窗口中设置的,而是在程序代码中设置的。
控件 |
名称(name) |
属性 |
MCI |
MMControl1 |
DeviceType:WaveAudio |
Notify:False | ||
Wait:True | ||
Shareable:False | ||
Visible:False |
注意:MCI控件的Notify属性的值为True时,将创建所谓的回调事件,在这个简单的程序里我不需要完成这样复杂的工作
(2)代码编写
在设计好应用程序的界面后,就需要为它编写代码。该PlayTune程序的代码如下面列表框中代码段所示,主要是使用MCI控件的Open、Play、Close方法来实现操作的。
注: 多数情况下,在运行Open命令打开设备之前,你需要用FileName属性指定你想要使用的媒体文件。一个重要的例外是在连接的CD-ROM驱动器中播放音频CD盘。这时,由于音频CD不是用文件名来跟踪其内容,所以不需要指定文件名了。对这种类型的媒体来说,只需要简单地用Command属性发出Open命令,就会从第一条磁轨开始播放CD。
Private Sub Form_Load()
MMControl1.Notify = False
MMControl1.Visible= False
MMControl1.Wait = True
MMControl1.Shareable = False
MMControl1.DeviceType = "WaveAudio"
MMControl1.FileName = "C:\WINDOWS\Media\Microsoft Office 2000\applause.wav"
'FileName属性为applause.wav文件的路径,applause.wav是要打开播放的.wav文件
MMControl1.Command = "Open"
MMControl1.Command = "Play"
End Sub
Private Sub Form_Unload(Cancel As Integer)
MMControl1.Command = "Close"
End Sub
Private Sub Command1_Click()
End
End Sub
(2)运行程序
1) 单击工具条上的Start(开始)按钮运行程序,Visual Basic显示程序的欢迎界面窗体,并使用MCI控件播放applause.wav文件。
2) 窗体外观如图12-7。
图 12-15 运行界面
【例12.4】利用Multimedia MCI控件在指定的图片框中播放.avi文件。
(1) 在窗体的Load事件过程中编写如下代码:
Private Sub Form_Load()
MMControl1.DeviceType = "AVIVideo"
MMControl1.FileName = App.Path &"\SEARCH.AVI"
MMControl1.RecordVisible = False
MMControl1.EjectVisible = False
MMControl1.Command = "open"
MMControl1.hWndDisplay = Picture1.hWnd
End Sub
(2) 在窗体的Unload事件过程中执行Stop命令:
Private Sub Form_Unload(Cancel As Integer)
MMControl1.Command = "stop"
End Sub
图 12-16 程序界面
【例12.5】利用Multimedia MCI控件的多媒体功能制作一个简单的视频播放器。
要求:当单击“打开”按钮后,从“打开文件”对话框中选择要播放的文件,然后利用Multimedia MCI控件进行播放。
(1)界面设计。新建一个工程,为工程命名为多媒体,在窗体Form1上添加一个Multimedia MCI控件MMControl1、一个Slider控件Slider1、一个ToolBar控件ToolBar1、一个CommonDialog控件CommonDialog1和一个Picture控件Picture1,调整好各控件的位置和大小。将MMControl控件各按钮的有效性和可见性属性设置为True。为ToolBar1控件添加两个按钮分别为Topen和Tclose。
(2)代码编写。
编写Form_load()
Private Sub Form_load()
With MMControl1
.hWndDisplay = Picture1.hWnd ‘将Picture1设置为视频回放的界面
.Notify = True ‘将Notify属性设置为True,以便在Done事件中处理错误信息
.Wait = False ‘将Wait属性设置为False,采用非阻塞方法传递MCI命令
End With
End Sub
注意:对于有视频输出的设备来说,在播放时,一般会弹出一个窗体显示回放结果,但是有时用户可能希望指定显示的窗体,这时就可以使用Multimedia MCI控件的hWndDisplay属性。这里使用Form1窗体上的Picture1图片框作为视频回放窗口。
将Wait属性设置为False,这样Multimedia MCI控件采用非阻塞的方式传递MCI命令,不必等到下一条MCI命令完成才将控件返回应用程序。
编写MMControl1_Done事件代码
在MMControl1_Done事件中显示错误信息,必要时也可以加入其他代码。
Private Sub MMControl1_Done (NotifyCode As Integer)
With MMControl1
If .Error <> 0 Then
MsgBox “error #” & Error &,ErrorMessage
End If
End With
End Sub
编写Form_Resize事件代码。
由于并不是所有媒体都需要Picture1控件来显示,故在适当的时候应将Picture1控件隐藏,为此,编写如下事件代码:
Private Sub Form_Resize()
‘根据UsesWindows属性判断是否需要视频回放的窗体
If MMControl1.UsesWindows And MMControl1.DeviceID <> 0 Then
Form1.Height = Form1.ScaleHeight + Picture1.Top + Picture1.Height + 1000
‘显示Picture控件
Else
Form1.Height = Form1.Height - Form1.ScaleHeight + Picture1.Top
‘不显示Picture控件
End If
End Sub
编写Toolbar1_ButtonClick事件代码。
单击“打开”按钮时,查找媒体文本准备播放,单击“关闭”按钮时,停止播放。
Private Sub Toolbar1_ButtonClick (ByVal Button As MSComctLib,Button)
On Error Resume Next
Select Case Button.Key
Case “TOpen”
With CommonDialog1
.CancelError = True
.ShowOpen
If .FileName <> “”Then
MMControl1. FileName = . FileName
MMControl1.Command = “Open”
Slider1.Max = MMControl1.Length
Slider1.SmallChange = 1
Slider1.LargeChange = 1
Slider1.LargeChange = Slider1.Max/5
End If
Form_Resize
End With
Case “TClose”
If MMControl1.Mode = mciModeNotOpen Then ‘当设备没有打开时
MMControl1.Command = “Stop”
MMControl1.Command = “Close”
Form_Resize
End If
End Select
End Sub
编写MMControl1_StatusUpdate事件代码。
Private Sub MMControl1_StatusUpdate ()
With MMControl1
If .DeviceID <> 0 Then
If Slider1.Value <> .Position Then Slider1.Value = .Position
End If
End With
End Sub
在播放视频文件时,当MMControl1的TimeFormat属性被设置成mciFormatFrames时,StatusUpdate事件将在帧变化时调用,这是真正的位置变化。而在TimeFormat属性被设置成为mciFormatMilliSeconds时,StatusUpdate事件将在几毫秒后调用,这时MCI设备的位置不一定被改变了,如果强制更新滑杆的位置的话会造成滑杆无谓地闪烁。所以上面的代码中首先判断位置是否同步,再决定是否更新。
编写Form_Unload()
在关闭MCI设备前,必须显示地使用Stop停止MCI设备。
Private Sub Form_Unload(Cancel As Integer)
Form1.MMControl1.Command = “Stop”
Form1.MMControl1.Command = “Close”
End Sub
程序运行情况如下图所示。
【例12.5】MMControl控件制作一个简单的录音机。
界面设计。添加窗体Form2,在窗体上添加一个多媒体控件、一个工具栏、两个标签控件,Label1的Caption属性为“位置”,用来显示当前位置,Label2的Caption属性为“时间”,用来显示总时间。在ToolBar1控件上添加两个按钮“新建”和“保存”,其Key属性分别为TNew和TSave。
代码编写。
编写ToolBar1_ButtonClick事件代码。
Private Sub ToolBar1_ButtonClick(ByVal Button As MSComctlLib,Button)
On Error Resume Next
Selet Case Button.Key
Case “TNew” ‘单击“新建”按钮
With CommonDialog1
.CancelError = True
.Filter = “WaveFile(*.wav)│*.wav”
.ShowSave
If .FileName <> “” Then
UpdateRecord ‘调用UpdateRecord过程
MMControl1.RecordMode = mciRecordOverwrite ‘录音模式为覆盖式
MMControl1.FileName = .FileName
If Dir(.FileName) = “” Then ‘如果没有指定文件名则建立新文件名
MMControl1.DeviceType = “WaveAudio”
MMControl1.Command = “New”
End If
MMControl1.Command = “Open” ‘打开设备准备录音
End If
End With
Case “TSave” ‘单击“保存”按钮
If MMControl1.Mode <> mciModeNotOpen Then
MMControl1.Command = “Save” ‘设备已经打开,发出保存命令
End If
End Select
End Sub
编写UpdateRecord过程代码。
UpdateRecord过程用于在设备正在工作时,停止工作并保存文件,然后关闭设备以保证后续工作。
Private Sub UpdateRecord ()
With MMControl1
If .Mode <> mciModeNotOpen Then
.Command = “Stop”
.Command = “Save”
.Command = “Close”
End If
End With
End Sub
Form_load过程代码
Private Sub Form_load()
UpdateRecord
End Sub
这里,Form_load过程调用UpdateRecord过程进行初始化工作。
编写MMControl1_StatusUpdate过程用于更新Label1和Label2。
Private Sub MMControl1_StatusUpdate ()
Label1 = “位置:”+ Chr(13) + Chr(10)
Label1 = Label1 &Format$(MMControl.Position/1000, “0.00”) + “秒”
Label2 = “长度:”+ Chr(13) + Chr(10)
Label2 = Label2 &Format$(MMControl.Length /1000, “0.00”) + “秒”
End Sub
编写Form_Unload过程
Private Sub Form_Unload(Cancel As Integer)
Form2.MMControl1.Command = “Stop”
Form2.MMControl1.Command = “Close”
End Sub
程序运行情况如下图所示。