当前课程知识点:VC++面向对象与可视化程序设计(下):MFC编程基础 >  第10章 多媒体应用程序的设计 >  10-1 利用音频函数实现多媒体程序设计 >  10-1-4

返回《VC++面向对象与可视化程序设计(下):MFC编程基础》慕课在线视频课程列表

10-1-4在线视频

10-1-4

下一节:10-2

返回《VC++面向对象与可视化程序设计(下):MFC编程基础》慕课在线视频列表

10-1-4课程教案、知识点、字幕

我们在OnInitDialog里面增加这三个初始化的变量

那么这三个初始化变量增加完

实际上我们要做什么

我们在对话框上面安放了五个按钮

所以我们要对这五个按钮进行单击的响应操作

所以的话呢我们现在要回到对话框上来

我们为五个按钮添加它的消息响应函数

添加

那么单击

都用它缺省的程序名称

我们第一个是打开这个按钮

我们开始介绍“打开文件”按钮,这个按钮的消息响应

系统给我们生成了OnBnClickOpenButton这个函数

那么我们在这里面开始编写这个函数

首先我们这个函数是要打开一个文件

所以我们定义了一个CString类的变量叫做filename

实际上是定义了CString类的filename用来存储文件名

那么文件名后面有后缀

所以就是fileext

那么定义了CString类的fileext用来存储文件的扩展名

好了那么文件名扩展名有了

我们还要定义一个mci的OpenParms

这是定义一个结构体的变量用来存储打开文件的信息和返回的设备标识信息

大家有兴趣自己可以去看一下MCI_OPEN_PARMS这个参数

这个数据结构

然后我们定义了一个dwError

这是用来存储返回的错误标识

定义了一个静态的字符型的数组szFilter

这个是在打开文件的时候我们有一个过滤器

用来过滤我们所要打开的文件的后缀

我们打开的是wav文件

或者是mid文件

那我们可以看一下

如果我们这时候“打开文件”执行的时候

那么波形文件这个显示的第一个是wav文件

第二个的话是mid文件

好了这个是波形文件跟mid文件

然后,我们打开了一个文件对话框

HIDERADONLY OVERWRITEPROMPT这些参数

大家在前面都比较熟悉了,我就不细说了

如果大家忘了前面讲的内容

大家自己看一下这个CFileDialog这个类

这里相关的参数都可以在MSDN上找到

这里最后一个参数就是我们的过滤器

如果对话框dlg.DoModal()是IDOK,打开以后

我们获取文件名,获取文件扩展名

如果这时候这个值为“真”

刚才初始化时,这个值已经为“假”了

我们回过头看一下

初始化时,这些标识都是“假”的

这时候如果是“真”

我们就获取它的错误信息

怎么获取 mciSendCommand?

通过MCI设备的ID

ID为0,就是本机

如果是close,那么就关闭它

如果关闭不成功,则显示出错原因

出错原因

通过mciGetErrorString这个函数来获取它的错误信息

错误信息放在szErrorBuf这个字符数组里面

通过MessageBox把数组的内容显示出来

实际上就是错误信息

然后再告诉你MCI出错,给一个出错的ICONWARNING标志

否则,如果取不到这个错误信息,出现的就是不明错误标识

也就是说,如果系统探测出什么错误

就给出明确的错误信息

当然,出错的可能性千千万万

不可能系统智能到所有的出错都能捕捉

不能捕捉的状态,它就会给你一个不明错误标识

这是如果是正在播放的情况下

我们要打开文件

打开文件,如果是一个新的文件

旧的文件如果正在播放的话就得关闭掉

如果没有声音正在播放

我们就获取打开的文件

比如说,我们获取的是wav文件

当获取的为wav文件的时候

我们通过mciOpenParms打开的文件类型为waveaudio

如果我们打开的时候mid后缀

大家可以看下这个数据结构的成员

我们在这里定义了mciOpenParms这个参数

大家看一下它结构里面这些成员

比如有lpstrDeviceType

如果打开的是mid文件

会出现sequence这么一个标识

说明打开的是mid

然后获取文件名

将打开的文件存入mciOpenParms结构中

这里说的是如果原来没有正在播放的文件

我们通过这种形式打开文件进行播放

打开过程中我们仍然要捕捉可能的错误信息

所以,仍然用mciSendCommand来捕捉

这些参数就不细说了

我们教材里都有,我们教学网站也有完整的代码

发送打开文件命令,MCI_OPEN_TYPE参数说明

设备类型名包含在mciOpenParms结构体中

MCI_OPEN_ELEMENT参数说明要打开的文件名

包含在mciOpenParams结构体中

MCI_OPEN_TYPE和MCI_OPEN_ELEMENT

一个是说明设备类型名字包含在这个结构体中

第二个参数说明打开的文件名包含在mciOpenParms结构体中

这两个是不一样的

一个是open_type,另一个是open_element

这个如果“真”,那就出错了

那就打开不成功

同样跟前面一样,报错!

这两段代码,第一段代码是打开文件之前

已经有文件在播放

打开的时候必须把原来文件关闭

如果没有正在打开的文件

就直接打开

不管怎么说,原来打开也好

原来没有打开也好

现在都打开了一个新的文件

原来打开文件关闭,打开新文件

原来没有打开的,就直接打开

这时打开文件后

mciOpenParms我们要把获取的设备ID

赋给全局变量m_MCIDeviceID

然后设置正在“播放”的标识为FALSE

“暂停”标识也是FALSE

因为现在只是打开,还没有让它播放

所以,播放状态和暂停状态都应该是FALSE

我们做到这里只是打开了一个文件

还没开始让他播放

现在我们要让它播放音频,我们看怎么做

播放,我们仍然给他添加一个事件处理程序

用系统定义的OnBnClickedStartButton

下面我们介绍开始播放按钮的代码

首先我们要定义一个MCI_PLAY_PARMS

这个结构的变量,用来存储播放的相关信息

如果原来没有正在播放

我们就发送NOTIFY消息到指定的窗口句柄

发送NOTIFY消息是通知它准备播放

设置dwFrom的位置是从0开始

也就是从头开始播放

然后我们仍然要捕捉错误的消息

仍然通过mciSendCommand来捕捉播放的错误消息

如果出错,这个和前面打开出错的代码一样

就不说了,如果出错的话,就给出出错的消息

如果给不出明确的出错消息的话

它就告诉你是不明错误标识

这个跟前面是一样的

从0位置开始打开

打开后,播放的标识设为TRUE就可以了

就可以开始播放了

所以播放的操作比较简单

发送一个MCINOTIFY消息到指定窗口

然后从0开始播放

就可以了

系统就可以给你执行播放的操作

如果要做暂停的操作 我们这里有暂停/继续

我们也给他添加事件处理程序

根据系统缺省地OnBnClickedOauseButton

它的编辑代码

我们开始编辑暂停/继续这个按钮的代码

如果有正在播放的声音

而且这个消息不是暂停状态

我们获取错误信息

错误信息这块的代码都是一样的

我就不再重复了

然后就给它设为“暂停”

如果不是“暂停”状态,给它设为“暂停”

这个实际上是一个错误陷阱

对于初学者来说,这里不写,也没有关系

不写的话,就把前面的这个设置

跟szErrorBuf两个参数不用设置它也可以

整个程序运行过程中不去判断他的错误

写上的话,有一个错误的控制可能效果会更好一点

也就是说,如果不是处于“暂停”状态

就给它设为“暂停”

否则的话,如果已经处于“暂停”状态

我们仍然要捕捉错误

你不去捕捉,也可以不写这个

已经处于“暂停”状态的,就把“暂停”状态变为FALSE

因为按下那个按钮后,它是互斥的操作

一个“暂停”,一个“播放”

处于“播放”状态的可以变成“暂停”状态

处于“暂停”状态的可以变成“播放”状态

实际上判断前面的值是

TRUE变成FALSE,FALSE变成TRUE

所以这个比较简单

下面我们要响应一个“停止”按钮的操作

选一个系统推荐的函数名 OnBnClickedStopButton

我们在这里面刚开始也是先捕捉错误消息

错误消息这块不说了

对于“停止”的话

正在“播放”的标识和正在“暂停”的标识都设为FALSE

跟初始状态变成一样的

停止播放跟程序一运行时候的状态应该是一样的

就是什么都没有播放

然后弹出一个消息框

如果播放新的文件,请在打开前先关闭所有的文件

要注意,这里面有一个按钮

实际上核心的就是这两个

恢复到初始状态

然后跟初始状态不一样的是什么?

它是正处在“播放”状态,“暂停”状态停止

所以它有一个消息框提示

而程序的运行状态是不存在这个消息框提示的

因为程序一运行的话,一定是播放新文件

这就是关于“暂停”的操作

“退出”的话,也同样响应一个函数

我们就编写退出这个按钮的消息响应代码

退出的话先执行关闭文件

因为关闭完才能“退出”

所以这里先执行OnBnClickedStopButton

这就是前面写的代码,先执行这个函数

然后OnOK(),对话框里面的OnOK()关闭窗口

这样整个程序就关闭了

大家要注意一个问题

就是我们播放的时候

曾经发过一个NOTIFY消息

而且我们获取了这个窗口句柄

为发送MCI_NOTIFY消息指定窗口句柄

既然是发送NOTIFY消息

我们就得有NOTIFY消息的消息处理函数

mciSendCommand里面,这是开始播放声音

MCI_FROM是说明开始播放的位置

包含在mciPlayParms结构体中

实际上是mciPlayParms中的dwFrom参数

MCI_NOTIFY的意义是在播放完后发送

MCINOTIFY消息

所以下面我们就要响应MCINOTIFY消息

所以我们开始手动添加

在10_2Dlg.h这个对话框类里面

添加一个消息处理函数

我们添加afx_msg LRESULT MciNotify

这里包含字参数和长字参数

我们添加这个的时候

仍然要在它的cpp文件里面的消息映射的地方

我们要增加一个内容

这个大家应该说都比较熟悉了

我们添加一个通知消息的响应

这个是响应的函数

这个是对MCI_NOTIFY消息进行的响应

下面我们就要编写这个响应代码

这个代码是MciNotify

然后,如果播放成功

成功播放完成后,我们要重置标识

那就是MCI_NOTIFY_SUCCESSFUL

如果字参数等于它的话

说明播放成功

播放成功之后应该进入初始状态

所以全部设成FALSE

否则就返回错误的标志

return一个错误标志

关于这个例子我们就介绍到这里

我们现在打开一个文件

然后播放

我们仍然打开刚才第一个例子那个音频 Ring09

“播放”、“暂停”、“继续”、“停止”、“退出”

下面我们运行一下这个程序

首先我们打开文件

我们还打开这一讲里面第一个例题用的音频文件Ring09

我们看一下播放的效果

“播放”、“暂停”、“继续”、“停止”

“停止”!我们会出一个对话框

“退出”!

同样我们换一个文件来执行

如果我们打开Logoff这个文件

然后进行“播放”、“暂停”、“继续播放”、“停止”、“退出”

说明我们这个音频播放器是能够正常工作的

VC++面向对象与可视化程序设计(下):MFC编程基础课程列表:

第0章 课前讨论

-讨论实录

--0-0

第6章 MFC基础知识

-6-1 MFC概述

--6-1 MFC基础知识

-6-2 C++的基本知识

--6-2-1 类

--6-2-2 对象

--6-2-3 类的方法

--6-2-4 内联函数

--6-2-5 构造函数和析构函数

--6-2-6 重载

--6-2-7 友元函数

--6-2-8 友元类

--6-2-9 指针

--6-2-10 类的继承

--6-2-11 多态性和虚拟函数

-6-3 MFC类的组织结构及主要的类的简介

--6-3-1 MFC类的组织结构

--6-3-2 根类

--6-3-3 应用程序结构类

--6-3-4 可视对象类

--6-3-5 通用类

--6-3-6 OLE类

--6-3-7 ODBC数据库

-6-4 MFC中全局函数和全局变量

--6-4 MFC中全局函数和全局变量

第7章 Windows标准控件在可视化编程中的应用

-7-1 概述

--7-1-1

--7-1-2

-7-2 按钮控件及其应用

--128B12447816EEF99C33DC5901307461

-7-3 按钮控件及其应用

--7-3

-7-4 静态控件

--7-4

-7-5 列表框控件

--7-5-1

--7-5-2

-7-6 编辑框控件

--7-6

-7-7 组合框控件

--7-7

-7-8 对话框通用控件

--7-8-1

--7-8-2

-讲义源代码

--html

第8章 在MFC中创建应用程序的资源

-8-1&2 资源的应用以及菜单资源的使用

--8-1-1

--8-1-2

-8-3 快捷菜单的创建及其应用

--8-3

-8-4 加速键资源的创建及其使用

--8-4

-8-5 工具条资源的创建及其使用

--8-5

-8-6 字符串资源的使用

--8-6

-8-7 位图资源的创建及其使用

--8-7

-课堂示例源代码

--html

-第一次作业内容及要求

--html

--第一次作业及答题链接--作业

第9章 单文档与多文档

-9-1 概述

--9-1

-9-2 Doc/View框架的主要成员

--Video

-9-3 文档操作中的一些重要概念

--Video

-9-4 SDI编程实例

--Video

-9-5 MDI编程实例

--9-5-1

--9-5-2

-课堂示例源代码

--html

-第二次作业内容及要求

--html

--第二次作业及答题链接--作业

第10章 多媒体应用程序的设计

-10-1 利用音频函数实现多媒体程序设计

--10-1-1

--10-1-2

--10-1-3

--10-1-4

-10-2 利用Windows Media Player控件实现多媒体程序设计

--10-2

-课堂示例源代码

--html

第11章

-例11-1

--例1

-例11-2

--例11-2

-例11-3

--例11-3

-例11-4

--例11-4

-11-1 ODBC介绍与引用

--11-1

-课堂示例源代码

--html

第三次作业及答题链接

-第三次作业及答题链接

10-1-4笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。