PlaySound和sndPlaySound的三种播放音乐方法

首先要添加头文件

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

 

1. 通过filename来定位文件播放

PlaySound(TEXT("c:\\crossing field.wav"), NULL, SND_FILENAME | SND_ASYNC); // TEXT()函数处理宽字符问题,SND_FILENAME标识采用文件名播放,SND_ASYNC标识异步播放,即PlaySound函数开始播放后便返回执行代码而不是等到播放完了再执行(此种方式对应SND_SYNC) 
sndPlaySound(TEXT("c:\\crossing field.wav"), SND_FILENAME | SND_ASYNC);

这种方式依赖于外部文件,若文件位置改变,则无法正常播放,所以有接下来两种方法。 

 

 

 

2. 通过资源文件播放

首先将wav文件添加进资源.rc文件,假设文件ID为IDR_WAVE1,则代码如下

PlaySound((LPCTSTR)IDR_WAVE1, NULL, SND_RESOURCE | SND_ASYNC | SND_LOOP); // 将文件ID强制转换为LPCTSTR型数据,然后标明是采用资源文件的形式播放(SND_RESOURCE),异步(SND_ASYNC),循环(SND_LOOP)

 

sndPlaySound((LPCTSTR)IDR_WAVE1, SND_RESOURCE | SND_ASYNC | SND_LOOP); // 同PlaySound

  

 

 

 

 

3. 通过加载进内存播放

首先找到资源文件

 

HRSRC hrsrc = FindResource(NULL, (LPCTSTR)IDR_WAVE1, TEXT("WAVE")); // IDR_WAVE1为文件ID,WAVE为文件ID所在文件夹名称

若成功则返回资源文件句柄,将其赋给hrsrc,失败返回NULL

接着加载资源文件

 

HGLOBAL hglobal = LoadResource(NULL, hrsrc); // 将第一步成功的句柄传给LoadResource作为参数,并得到HGLOBAL的实例hglobal 

同样失败返回NULL

最后锁定资源同时得到该资源在内存中的首地址

LPCWSTR pBuffer = (LPCWSTR)LockResource(hglobal); // LockResource返回LPVOID型指针,强制转换为LPCWSTR型

拿到pBuffer后就可以调用PlaySound和sndPlaySound函数了

PlaySound(pBuffer, NULL, SND_MEMORY | SND_ASYNC | SND_LOOP); // SND_MEMORY表明播放内存中的声音数据
sndPlaySound(pBuffer, SND_MEMORY | SND_ASYNC | SND_LOOP);

 

 

 

第一种方式是外部调用,所以生成的exe文件很小,而第二种第三种会把wav文件压进exe文件,所以文件会变得特别大……

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值