这次我们来编写一个简易的声音播放程序,首先来看一个例子:
#include<Windows.h>
#pragma comment(lib, "winmm.lib")
int WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nShowCmd)
{
PlaySound(L"Deep Coral Caves J.wav", NULL, SND_FILENAME | SND_ASYNC);
MessageBox(NULL, L"Deep Coral Caves J 游戏声音世界", L" 消息窗口", 0);
return 0;
}
上图:
可以看到仅比上一节多了两行代码,要播放声音,需要用到PlaySound函数,要使用PlaySound函数就需要在编译前链接winmm.lib文件, winmm.dll是Windows多媒体相关应用程序接口,用于低档的音频和游戏手柄。里面包含了PlaySound函数的实现。
#pragma comment(lib, “winmm.lib”)
这一行的作用就是在编译前链接winmm.lib文件。
接下来简单讲一下PlaySound函数;查看定义:
可以看到PlaySound函数有三个参数,第一个参数是LPCSTR型的pszSound,是一个字符串,表示要播放的声音文件,即文件名。
第二个参数是HMODULE型的hmod,h还是表示句柄,MODULE是模块的意思,HMODULE即为模块句柄,表示第一个参数指定的声音文件作为资源的可执行文件的句柄。
第三个参数DWORD类型的fdwSound,是用来播放声音的一个标志有很多可选标识,具体查看https://msdn.microsoft.com/zh-cn/dd743680;当选用多个标识时使用“|”来划分,可以对DWORD类型查看定义:
可以发现DWORD其实是unsigned long类型,这一点可以查看SND_FILENAME 与SND_ASYNC看到:
#define SND_FILENAME 0x00020000L /* name is file name */
#define SND_ASYNC 0x0001 /* play asynchronously */
SND_FILENAME与SND_ASYNC实际上是十六进制数。
最后,比较重要的一点,需要把wav声音文件放入到工程文件夹下: