MFC下MCI的使用播放音乐
最近研究了一下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] = {};
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(,
MCI_OPEN,
MCI_OPEN_ELEMENT|MCI_WAIT|MCI_OPEN_SHAREABLE,
(DWORD)(LPVOID)&mciOP); if (dwReturn == )
{
m_wID = mciOP.wDeviceID;
}
else
{
m_wID = NULL;
} CyclePlay();
} void CMp3Dlg::CyclePlay()
{
MCI_PLAY_PARMS PlayParms;
PlayParms.dwCallback = (DWORD)GetSafeHwnd();
PlayParms.dwFrom = ;
//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 = ;
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);
}
}
以上所述经过测试!
MFC下MCI的使用播放音乐的更多相关文章
- H5页面在IOS下不会自动播放音乐的坑
document.addEventListener(‘DOMContentLoaded‘, function () { function audioAutoPlay() { var audio = d ...
- C# 播放音乐
用 .NET 自带的类库 System.Media 下面的 SoundPlayer 来播放音乐的方式,此种方式使用托管代码,应该是更为可取的方式吧 使用起来非常简单,下面稍作说明: . 支持同步.异步 ...
- 在Linux终端命令行下播放音乐的命令(Ubuntu)
现在的 Linux 桌面已经发展的很好了,在桌面下播放音乐操作起来也很简单.那么我们还记得在桌面不是那么好的时候我们是怎么播放音乐的么?哎,我是想不起来了,实在是太难了. 不过现在我们可以先安装一个小 ...
- MediaPlayer音乐播放器、上一首、下一首、播放、停止、自动下一首、进度条
本文介绍MediaPlayer的使用.MediaPlayer可以播放音频和视频,另外也可以通过VideoView来播放视频,虽然VideoView比MediaPlayer简单易用,但定制性不如用Med ...
- Android使用的webcview中带有音乐播放控件,在关闭或分享时处于界面不可见状态下,声音仍在播放的问题解决
一. 问题出现原因 我们在做APP分享时,分享webview加载带有音乐播放控件的网页.当弹出分享界面,webview的网页处于后台状态或关闭该网页时,音乐声仍在播放.出现该类现象使我 ...
- 在Linux终端命令行下播放音乐的命令
现在的 Linux 桌面已经发展的很好了,在桌面下播放音乐操作起来也很简单.那么我们还记得在桌面不是那么好的时候我们是怎么播放音乐的么?哎,我是想不起来了,实在是太难了. 不过现在我们可以先安装一个小 ...
- pcDuino-V2利用madplay播放音乐
在pcDuino的UBUNTU系统下,打开控制台,利用apt-get来下载madplay软件. sudo apt-get install madplay 播放音乐: madplay xxx.mp3 x ...
- matlab播放音乐
最近在做计算,写了一些matlab代码,脑壳还疼,所以决定发挥一下逗B精神,写一个程序玩一下. 想了想,既然写代码的时候喜欢听歌,而且我的电脑打开网易音乐的速度巨慢(不知道为什么..),那些一个程序直 ...
- go语言让windows发出声音,或者播放音乐
go语言让windows发出声音,或者播放音乐的例子:会发出alert警告的声音 ( 这是我应群员的求助写的, 如果你需要了解其中的调用原理或过程 或更多go语言调用win32api的资料,加群: 2 ...
随机推荐
- JS---控制键盘事件
键盘事件汇总: 1.onkeydown 键盘按下时触发; 2.onkeyup 键盘按下后抬起触发的事件 3.onkeypress 这个事件在用户按下并放开任何字母数字键时发生(不常用) keyCo ...
- C# Oracle insert 中文乱码
问题描述: 在PL SQL中insert 中文数据,显示不乱码,通过后台insert的中文数据,显示问号. 解决分三步: 1.Select userenv('language') from dual; ...
- ACM第四次积分赛
虽然因为第一题给的数据有问题,没能四道题都做出来,但是这次第四名,进步很大,继续努力! SAU-ACM总比赛成绩 姓名 账号 上学期成绩 第一次成绩 第二次成绩 第三次成绩 第四 ...
- CentOS7 citus9.5 集群安装及管理
1 所有节点配置 #------服务安装 服务yum update -y #------扩展依赖安装yum install -y epel-release && yum update ...
- Gdiplus 贴图(助记) -------------------拖动整个对话框
最简单的两种方法: 一.使WM_NCHITTEST始终返回HTCAPTION,也就是欺骗系统让他以为这是菜单栏. LRESULT CDemoDlg::OnNcHitTest(CPoint point) ...
- Win7安装mysql数据库、修改默认密码
学习和使用myslq数据库半年时间,mysql对于每一个开发人员都不会陌生.今天对电脑重装系统,为了方面测试在个人PC上安装了mysql数据库.以一下是整个安装过程. 一.下载mysql 1.首先需要 ...
- webapp在Android中点击链接的时候会有淡蓝色的遮罩层
body{-webkit-tap-highlight-color: rgba(0,0,0,0);}
- caffe训练超参数
错误: caffe % ./build/tools/caffe train -solver models/finetune_flickr_style/solver.prototxt -weights ...
- MySQL5.5.28启动错误 The server quit without updating PID file
今天重新安装了一次 MySQL5.5.28 ,但启动的时候老是报错 Starting MySQL.. ERROR! The server quit without updating PID file ...
- hdu 3986 Harry Potter and the Final Battle
一个水题WA了60发,数组没开大,这OJ也不提示RE,光提示WA...... 思路:先求出最短路,如果删除的边不是最短路上的,那么对结果没有影响,要有影响,只能删除最短路上的边.所以枚举一下最短路上的 ...