// test2.cpp : Defines the entry point for the application.
//
#include "stdafx.h"
#include <mmsystem.h>
int APIENTRY WinMain(HINSTANCE hInstance,
{
//
//
MessageBox(NULL , TEXT("你是笨蛋") ,TEXT("测试") ,MB_OK|MB_OKCANCEL);
// SendMessage(HWND_BROADCAST,
return 0;
}
播放声音文件
(1)用途:游戏里播放音乐;自己动手给女友做音乐贺卡(图片、滚动的字母、温馨的音乐)
(2)可以使用PlaySound()函数播放声音文件,该函数原型位于#include <mmsystem.h>中,
提示:mm就是MultiMedia的简写,多媒体
(3)函数原型为:
返回值表示是否播放成功。
参数pszSound是要播放声音的文件名,只支持WAV等格式的文件;去mp3.baidu.com用“wav”为关键词可以搜到很多wav音乐,也可以用工具将其他格式的转换为wav格式的。
参数hmod是应用程序的实例句柄,一般传递NULL就可以;
参数fdwSound是标志的组合掩码,可选值有SND_FILENAME、SND_ASYNC、SND_SYNC等。SND_FILENAME表示pszSound参数指定的是文件名(pszSound还可以指定资源、内存音乐、系统音乐等等);SND_ASYNC:用异步方式播放声音,PlaySound函数在开始播放后立即返回;SND_SYNC:同步播放声音,在播放完后PlaySound函数才返回;SND_LOOP一遍遍的重复播放声音,必须与SND_ASYNC标志一块使用。
(4)使用举例:
PlaySound(TEXT("C:\\WINDOWS\\Media\\Windows
注意的问题:文件名中的反斜线要用“\\”,因为C语言中“\”默认是转义符,如果要表示“\”则需要使用“\\”,对这点不明白的请回去翻一下C语言的书;对中文字符串要使用TEXT宏。
(5)为啥构建不通过?
#include <mmsystem.h>只是保证编译通过,还要设定link。
解决方案:工程上点击右键,选“工程设置”,连接,添加“winmm”库。
解决此问题时参考的文章:http://hi.baidu.com/big_foot/blog/item/4822fcd11a7f7cd6562c84e7
附录:VC中添加Link库的方式:
project->setting->Link
(6)接上面的问题:关于link库
一个程序由源代码变成exe文件有两步:编译Compile;连接Link。编译是把c文件编译成.o、.obj文件,而连接则是把这些.o、.obj、.lib等文件连接到一起成为exe文件。这点不清楚的请回去查看C语言的教材。
那什么是*.lib文件呢?大家以前用TC开发程序的时候用的都是C语言内置的函数,所以不存在使用非内置函数的情况。但是在开发大程序的时候要大量用到非内置的函数,比如PlaySound、MessageBox等等。在使用这些函数的时候需要使用两部分,一部分是*.h头文件,它定义了函数的参数和返回值,另一部分是*.lib文件,是用来进行程序链接用的。C程序的构建分为编译(Compile)和连接(Link)两个过程,Compile是把源代码编译成*.obj文件,每个源码文件都对应一个*.obj文件,而连接则是把这些*.obj文件以及使用到的非内置函数的*.lib文件连接成一个*.exe文件。所以无论是忘了include *.h文件,还是丢了*.lib文件,都会构建出错。从上面的报错信息可以看出来是Compile成功,但是Link失败。一定要记得C程序编译的这两个过程,面试、笔试的时候常考。
(7)同步播放音乐
PlaySound("C:\\WINDOWS\\Media\\Windows
(8)体会同步播放和异步播放的差异:
PlaySound("C:\\WINDOWS\\Media\\Windows
MessageBox(NULL,"同步播放完毕","信息",MB_OK);
PlaySound("C:\\WINDOWS\\Media\\Windows
MessageBox(NULL,"异步播放立即返回","信息",MB_OK);
有没有同学注意到第二个对话框如果快速关闭的话音乐会中途停止?这是因为程序退出音乐就中断播放了。用户关了游戏,音乐也不能继续播放,应该停止,所以很合理
(9)我可以做一个小程序,别人在我小程序运行的时候一直听播放的音乐,用异步方式可以保证音乐在后台播放。可以只能播放一遍,能不能音乐来回来去的不断播放呢?答案是使用SND_LOOP标志。
Loop:循环
PlaySound("C:\\WINDOWS\\Media\\Windows
NULL,SND_FILENAME|SND_ASYNC|SND_LOOP);
(10)如果我做一个小游戏,那么希望向上边那样不断播放,可以到达一个关卡的时候希望停止原来的音乐怎么办?
PlaySound(TEXT("C:\\WINDOWS\\Media\\Windows
MessageBox(NULL,TEXT(""),TEXT(""),MB_OK);
PlaySound(TEXT("C:\\WINDOWS\\Media\\Windows
MessageBox(NULL,TEXT(""),TEXT(""),MB_OK);
只能同时播放一段音乐,启动新的、旧的就被停了
(11)如果只是想停止目前的播放而不播放新音乐呢?
PlaySound("C:\\WINDOWS\\Media\\Windows
NULL,SND_FILENAME|SND_ASYNC|SND_LOOP);
MessageBox(NULL,"点