MFC中的几种播放声音的方法

一.播放声音文件的简单方法
  在VC++ 中的多媒体动态连接库中提供了一组与音频设备有关的函数。利用这些函数可以方便地播放声音。最简单的播放声音方法就是直接调用VC++中提供的声音播放函 数BOOL sndPlaySound ( LPCSTR lpszSound,UINT fuSound ); 或BOOL PlaySound( LPCSTR lpszSound, HMODULE hmod, DWORD fuSound );其中参数lpszSound是需要播放声音的.WAV文件的路径和文件名, hmod在这里为NULL,fuSound是播放声音的标志,具体说明请参考VC++中的帮助。例如播放C:\sound\music.wav可以用 sndPlaySound ("c:\\sound\\music.wav",SND_ASYNC);或PlaySound("c:\\sound \\music.wav",NULL, SND_ASYNC|SND_NODEFAULT );假如没有找到music.wav文件,第一种格式将播放系统默认的声音,第二种格式不会播放系统默认的声音。

二.将声音文件加入到程序中
  在VC++的程序设计中,可以利用各种标准的资源,如位图,菜单,对话框等。同时VC++也答应用户自定义资源,因此我们可以将声音文件作为用户自定义资源加入程序资源文件中,经过编译连接生成EXE文件,实现无.WAV文件的声音播放。
  要实现作为资源的声音文件的播放,首先要在资源管理器中加入待播放的声音文件(实现过程并不复杂,这里不在叙述)。假设生成的声音文件资源标识符为IDR_WAVE1。在播放时只需要调用下面的语句:
  PlaySound(MAKEINTRESOURCE(IDR_WAVE1),AfxGetResourceHandle(),   SND_ASYNC|SND_RESOURCE|SND_NODEFAULT|SND_LOOP);
  其中MAKEINTRESOURCE()宏将整数资源标识符转变为字符串,AfxGetResourceHandle()函数返回包含资源的模块句柄,
SND_RESOURCE是必须的标志。
  作为资源的声音文件的第二种播放方法是把资源读入内存后作为内存数据播放。具体步骤入下:
  1.获得包含资源的模块句柄:
  HMODULE hmod=AfxGetResourceHandle();
  2.检索资源块信息:
  HRSRC hSndResource=FindResource(hmod,MAKEINTRESOURCE(IDR_WAVE1),_T("WAVE"));
  3. 装载资源数据并加锁:
  HGLOBAL hGlobalMem=LoadResource(hmod,hSndResource);
LPCTSTR lpMemSound=(LPCSTR)LockResource(hGlobalMem);
  4.播放声音文件:
  sndPlaySound(lpMemSound,SND_MEMORY));
  5.释放资源句柄:
  FreeResource(hGlobalMem);

第三种方法是用PlaySound播放系统声音,Windows启动的声音是由SystemStart定义的系统声音,因此可以用下面的方法播放启动声音:
PlaySound("SystemStart",NULL,SND_ALIAS|SND_ASYNC);
函数sndPlaySound的功能与PlaySound类似,但少了一个参数。函数的声明为:
BOOL sndPlaySound(LPCSTR lpszSound, UINT fuSound);
除 了不能指定资源名字外,参数lpszSound与PlaySound的是一样的。参数fuSound是如何播放声音的标志,可以是SND_ASYNC、 SND_LOOP、SND_MEMORY、SND_NODEFAULT、SND_NOSTOP和SND_SYNC的组合,这些标志的含义与 PlaySound的一样。
可以看出,sndPlaySound不能直接播放声音资源。要用该函数播放WAVE文件,可按下面的方式调用

 

=================================================================================

一、PlaySound函数的声明为:

BOOL PlaySound(LPCSTR pszSound,HMODULE hmod,DWORD fdwSound);

参数说明:

pszSound:是指定了要播放声音的字符串,该参数可以是WAVE文件的名字,或是WAVE资源的名字,或是内存中声音数据的指针,或是在系统注册表WIN.INI中定义的系统事件声音.假如该参数为NULL则停止正在播放的声音.

hmod:是应用程序的实例句柄,当播放WAV资源时要用到该参数,否则它必须为NULL.

fdwSound: 是标志的组合,如下表所示。若成功则函数返回TRUE,否则返回FALSE。
二、播放标志以及含义:

SND_APPLICATION
用应用程序指定的关联来播放声音。

SND_ALIAS
pszSound参数指定了注册表或WIN.INI中的系统事件的别名。

SND_ALIAS_ID
pszSound参数指定了预定义的声音标识符。

SND_ASYNC
用异步方式播放声音,PlaySound函数在开始播放后立即返回。

SND_FILENAME
pszSound参数指定了WAVE文件名。

SND_LOOP
反复播放声音,必须与SND_ASYNC标志一块使用。

SND_MEMORY
播放载入到内存中的声音,此时pszSound是指向声音数据的指针。

SND_NODEFAULT
不播放缺省声音,若无此标志,则PlaySound在没找到声音时会播放缺省声音。

SND_NOSTOP
PlaySound不打断原来的声音播出并立即返回FALSE。

SND_NOWAIT
假如驱动程序正忙则函数就不播放声音并立即返回。
SND_PURGE
停止所有与调用任务有关的声音。若参数pszSound为NULL,就停止所有的声音,否则,停止pszSound指定的声音。
SND_RESOURCE
pszSound参数是WAVE资源的标识符,这时要用到hmod参数。
SND_SYNC
同步播放声音,在播放完后PlaySound函数才返回。

三、函数使用方法及代码:

注重:在使用函数前要加入:

#include "mmsystem.h"//导入声音头文件

#pragma comment(lib,"winmm.lib")//导入声音头文件库

1、直接播出声音文件:

PlaySound("c:\\win95\\media\\The Microsoft Sound.wav", NULL, SND_FILENAME | SND_ASYNC);
注重:参数中的路径使用两个连续的反斜杠转义代表一个反斜杠。

2、把声音文件加入到资源中,然后从资源中播放声音:

Visual C++支持WAVE型资源,用户在资源视图中单击鼠标右键并选择Import命令,然后在文件选择对话框中选择The Microsoft Sound.wav文件,则该文件就会被加入到WAVE资源中。假定声音资源的ID为IDR_STARTWIN,则下面的调用同样会输出启动声音:
PlaySound((LPCTSTR)IDR_STARTWIN, AfxGetInstanceHandle(), SND_RESOURCE | SND_ASYNC);

或:

PlaySound(MAKEINTRESOURCE(IDR_WAVE2),AfxGetResourceHandle(),SND_ASYNC|SND_RESOURCE|SND_NODEFAULT|SND_LOOP);//将声音文件写入到程序中
3、用PlaySound播放系统声音:

Windows启动的声音是由SystemStart定义的系统声音,因此可以用下面的方法播放启动声音:
PlaySound("SystemStart",NULL,SND_ALIAS|SND_ASYNC);
            

sndPlaySound函数的声明为:
BOOL sndPlaySound(LPCSTR lpszSound, UINT fuSound);

用法:

除了不能指定资源名字外,参数lpszSound与PlaySound的是一样的。参数 fuSound是如何播放声音的标志,可以是SND_ASYNC、SND_LOOP、SND_MEMORY、SND_NODEFAULT、 SND_NOSTOP和SND_SYNC的组合,这些标志的含义与PlaySound的一样。
可以看出,sndPlaySound不能直接播放声音资源。要用该函数播放WAVE文件,可按下面的方式调用:
sndPlaySound("MYSOUND.WAV",SND_ASYNC);

转载于:https://www.cnblogs.com/dancheblog/p/4529636.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/544767.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

标志枚举的使用

标志枚举的使用大多是在标记多重状态,比如说文件的属性:只读,可写,隐藏,系统文件等相关属性,都对应相应的标志位,如果在C#中想实现自己的标志枚举,也是可以的,下文是亲身…

duration java_Java Duration类| 带示例的getUnits()方法

duration java持续时间类getUnits()方法 (Duration Class getUnits() method) getUnits() method is available in java.time package. getUnits()方法在java.time包中可用。 getUnits() method is used to get the List object that contains the units of seconds and Nanos …

synchronized 的超多干货!

synchronized 这个关键字的重要性不言而喻,几乎可以说是并发、多线程必须会问到的关键字了。synchronized 会涉及到锁、升级降级操作、锁的撤销、对象头等。所以理解 synchronized 非常重要,本篇文章就带你从 synchronized 的基本用法、再到 synchronize…

团队项目—第二阶段第三天

昨天:快捷键的设置已经实现了 今天:协助成员实现特色功能之一 问题:技术上遇到了困难,特色功能一直没太大的进展。网上相关资料不是那么多,我们无从下手。 有图有真相: 转载于:https://www.cnblogs.com/JJJ…

C# struct 装箱拆箱例子

值类型:拆箱、装箱 struct是值类型 struct和class的区别 类是引用类型,struct是值类型在托管堆上创建类的实例,在栈上创建struct实例类实例的赋值,赋的是引用地址,struct实例的赋值,赋的是值类作为参数类…

stl min函数_std :: min_element()函数以及C ++ STL中的示例

stl min函数C STL std :: min_element()函数 (C STL std::min_element() function) min_element() function is a library function of algorithm header, it is used to find the smallest element from the range, it accepts a container range [start, end] and returns a…

不重启JVM,替换掉已经加载的类,偷天换日?

来源 | 美团技术博客在遥远的希艾斯星球爪哇国塞沃城中,两名年轻的程序员正在为一件事情苦恼,程序出问题了,一时看不出问题出在哪里,于是有了以下对话:“Debug一下吧。”“线上机器,没开Debug端口。”“看日…

[nodejs] 利用openshift 撰寫應用喔

2019独角兽企业重金招聘Python工程师标准>>> 朋友某一天告訴我,可以利用openshift來架站,因為他架了幾個nodejs應用放在上面,我也來利用這個平台架看看,似乎因為英文不太行,搞很久啊!! 先來架一個看看,不過架好之後,可以有三個應用,每個應用有1G的空間,用完就沒啦~~…

C#单例模式的简单使用

单例模式示例: public sealed class WindowService {//定义一个私有的静态全局变量来保存该类的唯一实例private static WindowService Service;//定义一个只读静态对象//且这个对象是在程序运行时创建的private static readonly object syncObject new object();…

stl max函数_std :: max_element()函数以及C ++ STL中的示例

stl max函数C STL std :: max_element()函数 (C STL std::max_element() function) max_element() function is a library function of algorithm header, it is used to find the largest element from the range, it accepts a container range [start, end] and returns an…

详解4种经典的限流算法

最近,我们的业务系统引入了Guava的RateLimiter限流组件,它是基于令牌桶算法实现的,而令牌桶是非常经典的限流算法。本文将跟大家一起学习几种经典的限流算法。限流是什么?维基百科的概念如下:In computer networks, rate limiting is used t…

css clearfix_如何使用CSS清除浮点数(clearfix)?

css clearfixIntroduction: 介绍: Dealing with various elements on a website or web page can sometimes prove to create many problems hence one should be aware of many properties, tricks or ways to cope with those problems. We do not want our webs…

C# 写入注册表启动项

C# 写入注册表启动项 private void RegisterSelfKey() {try{string strName Application.ExecutablePath;if (!File.Exists(strName))return;string strnewName strName.Substring(strName.LastIndexOf("\\") 1);RegistryKey RKey Registry.LocalMachine.OpenSu…

将你的Windows,快速打造成Docker工作站!

手里的macbook因为键盘问题返厂维修了,只好抱起了久违的Windows。首先面临的,就是Docker问题。docker好用,但安装麻烦,用起来也命令繁多。一个小白,如何打造舒适的docker环境,是一个非常有挑战的问题。本文…

HTML5游戏引擎Egret发布2.0版 开发工具亦获更新

5月22日在北京国际会议中心举办的HTML5游戏生态大会上,白鹭时代旗下游戏引擎Egret Engine发布2.0版,同时还发布了Flash转换HTML5工具Egret Conversion、HTML5游戏加速Egret Runtime 2.0、GUI可视化编辑器Egret Wing 2.0、骨骼动画工具DragonBones4.0、富…

DES和AES加密:指定键的大小对于此算法无效

“System.ArgumentException”类型的未经处理的异常在 mscorlib.dll 中发生 其他信息: 指定键的大小对于此算法无效。 在看DES和AES加密的时候,找了个加密的Demo,自己试验的时候总是报:指定键的大小对于此算法无效 的错误。 原因为&#xf…

软件测试 测试策略_测试策略| 软件工程

软件测试 测试策略Testing is a process of checking any software for its correctness. Various strategies are followed by the testers while checking for the bugs and errors in the software. Let us have a look at these strategies: 测试是检查任何软件的正确性的过…

漫画:什么是JVM的垃圾回收?

————— 第二天 —————————————————下面我们一起来研究这三个问题。问题1:哪些是需要回收的?首先我们需要知道如何哪些垃圾需要回收?判断对象是否需要回收有两种算法。一种是引用计数算法、一种是可达性分析算法。引用计…

C#日期格式

关于C#中日期DateTime的格式转换代码如下: PS:请忽略Log.v(); 这个是自定义的日志方法…… DateTime dt DateTime.Now; Log.v(dt.ToString("D"));//2017年1月23日 Log.v(dt.ToString("d"));//2017/1/23 Log.v(dt.ToString("…

48张图|手摸手教你性能监控、压测和调优

本文主要内容一、何为压力测试1.1、 大白话解释性能压测是什么:就是考察当前软件和硬件环境下,系统所能承受的最大负荷,并帮助找出系统的瓶颈所在。性能压测的目的:为了系统在线上的处理能力和稳定性维持在一个标准范围内&#xf…