有求必应

导航

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;   
    }   
        

 
     

第二种方法没仔细研究,有些参数设置的不准确,导致程序卡死,暂时使用的是第一种方法,有用第二种的朋友可以在下面评论区留一下自己的学习经历。

posted on 2017-09-19 12:50  名侦探江户川  阅读(528)  评论(0编辑  收藏  举报