mfc播放音乐方法
一.利用PlaySound函数播放
1.在dlg.h中加入
#include <windows.h> #include <mmsystem.h> // 加上,不然PlaySound函数无法使用 #pragma comment(lib, "WINMM.LIB") // 加上,不然PlaySound函数无法使用 放在stdafx.h
2.加载资源.wav文件
打开资源管理器,右键.rc,加载资源,导入.wav文件(如果没有显示,可以改变文件类型为.wav,文件就能显示,并选择打开了)
3.添加按钮
双击按钮生成函数
4.在生成的函数中(详细用法查msdn)
PlaySound(MAKEINTRESOURCE(IDR_WAVE1),AfxGetResourceHandle(),SND_ASYNC|SND_RESOURCE|SND_NODEFAULT);//单次播放 //PlaySound(MAKEINTRESOURCE(IDR_WAVE1),AfxGetResourceHandle(),SND_ASYNC|SND_RESOURCE|SND_NODEFAULT|SND_LOOP);//循环播放
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函数才返回。
二.利用MCI_OPEN_PARMS结构体
typedef struct { DWORD_PTR dwCallback; MCIDEVICEID wDeviceID;//设备ID LPCTSTR lpstrDeviceType;//设备类型 LPCTSTR lpstrElementName;//文件名 LPCTSTR lpstrAlias;//别名 } MCI_OPEN_PARMS;
结构体成员具体为:
- dwCallback
-
The low-order word specifies a window handle used for the MCI_NOTIFY flag.
- wDeviceID
-
Identifier returned to application.
- lpstrDeviceType
-
Name or constant identifier of the device type. (The name of the device is typically obtained from the registry or SYSTEM.INI file.) If this member is a constant, it can be one of the values listed inMCI Device Types.
- lpstrElementName
-
Device element (often a path).
- lpstrAlias
-
Optional device alias.
MCI_PLAY_PARMS Structure
typedef struct { DWORD_PTR dwCallback; DWORD dwFrom; DWORD dwTo; } MCI_PLAY_PARMS;
成员:
Members
- dwCallback
-
The low-order word specifies a window handle used for the MCI_NOTIFY flag.
- dwFrom
-
Position to play from.
- dwTo
-
Position to play to.
Remarks
When assigning data to the members of this structure, set the corresponding flags in thefdwCommand parameter of the mciSendCommand function to validate the members.
方法:
char buf[128]; //use mciSendString() //mciSendString("play e:\\songs\\123.mp3",buf,sizeof(buf),NULL); //mciSendString("play e:\\songs\\zhj.mp3",buf,sizeof(buf),NULL); //char str[128] = {0}; //int i = 0; //use mciSendCommand MCI_OPEN_PARMS mciOpen; MCIERROR mciError; //mciOpen.lpstrDeviceType = (LPCTSTR)MCI_ALL_DEVICE_ID; //mciOpen.lpstrDeviceType = "waveaudio"; //只能播放.wav文件 //mciOpen.lpstrDeviceType = "avivideo"; //*.avi mciOpen.lpstrDeviceType = "mpegvideo"; //mciOpen.lpstrDeviceType = "sequencer"; mciOpen.lpstrElementName = "e:\\music\\forever.mp3"; //mciOpen.lpstrElementName = "e:\\movie\\first.avi"; //mciOpen.lpstrElementName = "c:\\winnt\\media\\Windows 登录音.wav"; mciError = mciSendCommand(0,MCI_OPEN,MCI_OPEN_TYPE | MCI_OPEN_ELEMENT,(DWORD)&mciOpen); if(mciError) { mciGetErrorString(mciError,buf,128); MessageBox("send MCI_PLAY command failed", "ERROR"); return; } UINT DeviceID = mciOpen.wDeviceID ; MCI_PLAY_PARMS mciPlay; //mciError = mciSendCommand(DeviceID,MCI_PLAY,0 ,(DWORD)&mciPlay); //MCI_FROM | MCI_TO | mciError = mciSendCommand(DeviceID, MCI_PLAY, MCI_WAIT | MCI_DGV_PLAY_REPEAT, (DWORD) (LPMCI_PLAY_PARMS)&mciPlay); //MCI_DGV_PLAY_REPEAT, 要 #include "Digitalv.h" if(mciError) { mciGetErrorString(mciError,buf,128); MessageBox("send MCI_PLAY command failed", "ERROR"); return; }
第二种方法没仔细研究,有些参数设置的不准确,导致程序卡死,暂时使用的是第一种方法,有用第二种的朋友可以在下面评论区留一下自己的学习经历。