您的位置:首页 > 其它

MFC下MCI的使用播放音乐

2014-08-07 18:11 357 查看
最近研究了一下MFC下的音乐的播放,主要使用了MCI

1.需要包含的库文件

在链接资源里(link)添加库文件VFW32.lib winmm.lib

2.包含的头文件

#include <mmsystem.h>

#include "stdafx.h"

#include "vfw.h"

#include <digitalv.h>

#pragma comment(lib,"winmm.lib")


3.需要调用的成员变量和成员函数的声明、定义

class CMp3Dlg : public CDialog
{
// Construction
public:
CMp3Dlg(CWnd* pParent = NULL);    // standard constructor

// Dialog Data
//{{AFX_DATA(CMp3Dlg)
enum { IDD = IDD_MP3_DIALOG };
CButton    m_Play;
CString    m_Path;
//}}AFX_DATA

// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CMp3Dlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
//}}AFX_VIRTUAL

// Implementation
protected:
HICON m_hIcon;

// Generated message map functions
//{{AFX_MSG(CMp3Dlg)
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
afx_msg void OnButtonOpenFile();
afx_msg void OnButtonPlayMusic();
afx_msg void OnButtonCyclePlay();
afx_msg void OnMciNotify(WPARAM wParam,LPARAM lParam);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()

public:
void CyclePlay();

private:
HWND m_video;
BOOL Pause;

MCIDEVICEID m_wID;
};


4.添加消息响应

BEGIN_MESSAGE_MAP(CMp3Dlg, CDialog)
//{{AFX_MSG_MAP(CMp3Dlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON_OPEN, OnButtonOpenFile)
ON_BN_CLICKED(IDC_BUTTON_PLAY, OnButtonPlayMusic)
ON_BN_CLICKED(IDC_BUTTON_CYCLE_PLAY, OnButtonCyclePlay)
ON_MESSAGE(MM_MCINOTIFY,OnMciNotify)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()


5.打开相应的文件
方法一:

void CMp3Dlg::OnButtonOpenFile()
{
// TODO: Add your control notification handler code here
TCHAR szBuffer[MAX_PATH] = {0};
BROWSEINFO bi;
ZeroMemory(&bi,sizeof(BROWSEINFO));
bi.hwndOwner = NULL;
bi.pszDisplayName = szBuffer;
bi.lpszTitle = _T("从下面选择文件或者文件夹:");
bi.ulFlags = BIF_BROWSEINCLUDEFILES;
LPITEMIDLIST idl = SHBrowseForFolder(&bi);

if (NULL == idl)
{
return;
}
SHGetPathFromIDList(idl,szBuffer);
}


方法二:

void CMp3Dlg::OnButtonOpenFile()
{
m_video = NULL;
if (m_video == NULL)
{
CFileDialog filedialog(TRUE,NULL,NULL,OFN_HIDEREADONLY,"MP3 Files (*.mp3)|*.mp3|");
if (filedialog.DoModal() == IDOK)
{
m_Path = filedialog.GetPathName();
UpdateData(FALSE);
}
}
}


6.音乐的播放
方法一:

void CMp3Dlg::OnButtonPlayMusic()
{
// TODO: Add your control notification handler code here
m_video = NULL;
if(m_video == NULL)
{
m_video = MCIWndCreate(this->GetSafeHwnd(),
AfxGetInstanceHandle(),
WS_CHILD | WS_VISIBLE|MCIWNDF_NOMENU,m_Path);
}
else
{
MCIWndHome(m_video);
}
MCIWndPlay(m_video);
m_Play.EnableWindow(FALSE);
}


方法二:

void CMp3Dlg::OnButtonCyclePlay()
{
// TODO: Add your control notification handler code here
MCI_OPEN_PARMS mciOP;
DWORD dwReturn;

//ASSERT(m_wID == NULL);

mciOP.lpstrDeviceType = NULL;
mciOP.lpstrElementName = m_Path;
dwReturn = mciSendCommand(0,
MCI_OPEN,
MCI_OPEN_ELEMENT|MCI_WAIT|MCI_OPEN_SHAREABLE,
(DWORD)(LPVOID)&mciOP);

if (dwReturn == 0)
{
m_wID = mciOP.wDeviceID;
}
else
{
m_wID = NULL;
}

CyclePlay();
}

void CMp3Dlg::CyclePlay()
{
MCI_PLAY_PARMS PlayParms;
PlayParms.dwCallback = (DWORD)GetSafeHwnd();
PlayParms.dwFrom = 0;
//mciSendCommand(m_wID,MCI_PLAY,MCI_DGV_PLAY_REPEAT,(DWORD)(LPVOID)&PlayParms);
mciSendCommand(m_wID,MCI_PLAY,MCI_NOTIFY,(DWORD)(LPVOID)&PlayParms);
}


7.循环播放
方法一:

mciSendCommand(m_wID,MCI_PLAY,MCI_DGV_PLAY_REPEAT,(DWORD)(LPVOID)&PlayParms);

//mciSendCommand(m_wID,MCI_PLAY,MCI_NOTIFY,(DWORD)(LPVOID)&PlayParms);

将上面的35行注释掉,使用34行

方法二:添加消息响应函数

void CMp3Dlg::OnMciNotify(WPARAM wParam,LPARAM lParam)
{
if(MCI_NOTIFY_SUCCESSFUL == wParam)
{
//mciSendCommand(m_wID,MCI_CLOSE,0,NULL);
//CyclePlay();
MCI_PLAY_PARMS PlayParms;
PlayParms.dwFrom = 0;
PlayParms.dwCallback = (DWORD)m_hWnd;
mciSendCommand(m_wID, MCI_SEEK,MCI_SEEK_TO_START, NULL);
mciSendCommand(m_wID, MCI_PLAY, MCI_NOTIFY, (DWORD)(LPVOID)&PlayParms);
}
}


以上所述经过测试!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: