最近研究了一下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的使用播放音乐的更多相关文章

  1. H5页面在IOS下不会自动播放音乐的坑

    document.addEventListener(‘DOMContentLoaded‘, function () { function audioAutoPlay() { var audio = d ...

  2. C# 播放音乐

    用 .NET 自带的类库 System.Media 下面的 SoundPlayer 来播放音乐的方式,此种方式使用托管代码,应该是更为可取的方式吧 使用起来非常简单,下面稍作说明: . 支持同步.异步 ...

  3. 在Linux终端命令行下播放音乐的命令(Ubuntu)

    现在的 Linux 桌面已经发展的很好了,在桌面下播放音乐操作起来也很简单.那么我们还记得在桌面不是那么好的时候我们是怎么播放音乐的么?哎,我是想不起来了,实在是太难了. 不过现在我们可以先安装一个小 ...

  4. MediaPlayer音乐播放器、上一首、下一首、播放、停止、自动下一首、进度条

    本文介绍MediaPlayer的使用.MediaPlayer可以播放音频和视频,另外也可以通过VideoView来播放视频,虽然VideoView比MediaPlayer简单易用,但定制性不如用Med ...

  5. Android使用的webcview中带有音乐播放控件,在关闭或分享时处于界面不可见状态下,声音仍在播放的问题解决

    一. 问题出现原因         我们在做APP分享时,分享webview加载带有音乐播放控件的网页.当弹出分享界面,webview的网页处于后台状态或关闭该网页时,音乐声仍在播放.出现该类现象使我 ...

  6. 在Linux终端命令行下播放音乐的命令

    现在的 Linux 桌面已经发展的很好了,在桌面下播放音乐操作起来也很简单.那么我们还记得在桌面不是那么好的时候我们是怎么播放音乐的么?哎,我是想不起来了,实在是太难了. 不过现在我们可以先安装一个小 ...

  7. pcDuino-V2利用madplay播放音乐

    在pcDuino的UBUNTU系统下,打开控制台,利用apt-get来下载madplay软件. sudo apt-get install madplay 播放音乐: madplay xxx.mp3 x ...

  8. matlab播放音乐

    最近在做计算,写了一些matlab代码,脑壳还疼,所以决定发挥一下逗B精神,写一个程序玩一下. 想了想,既然写代码的时候喜欢听歌,而且我的电脑打开网易音乐的速度巨慢(不知道为什么..),那些一个程序直 ...

  9. go语言让windows发出声音,或者播放音乐

    go语言让windows发出声音,或者播放音乐的例子:会发出alert警告的声音 ( 这是我应群员的求助写的, 如果你需要了解其中的调用原理或过程 或更多go语言调用win32api的资料,加群: 2 ...

随机推荐

  1. Xsser

    来源:https://www.cqhacker.cn/post-174.html   XSSer使用说明 =============================================== ...

  2. 关于CSRF的攻击

    CSRF攻击的原理: 1.当用户成功登陆网站A时,浏览器纪录本次会话cookie. 2.未退出网站A,点击了恶意网站B上的图片或者其他诱骗信息. 3.恶意网站B上的诱骗信息超链接到了网站A上面,冒充用 ...

  3. 原生JavaScript+CSS3实现移动端滑块效果

    在做web页面时,无论PC端还是移动端,我们会遇到滑块这样的效果,可能我们往往会想着去网上找插件,其实这个效果非常的简单,插件代码的的代码往往过于臃肿,不如自己动手,自给自足.首先看一下效果图: 分析 ...

  4. java实现的简单词法分析器

    一个简单的词法分析器 词法分析(Lexical Analysis) 是编译的第一阶段.词法分析器的主要任务是读入源程序的输入字符.将他们组成词素,生成并输出一个词法单元序列,每个词法单元对应一个词素. ...

  5. Error C1189: #error: Please use the /MD switch for _AFXDLL builds

    在VS 2013中编译程序时出现错误: 错误提示1: error C1189: #error : Building MFC application with /MD[d] (CRT dll versi ...

  6. HTML1高级

    HTML头部 一.链接在新窗口打开如果要定义整个网页的链接在新窗口打开,只要在/head里定义/base target="_blank"就可以了</p> 二.文档描述1 ...

  7. setcookie 设置无效

    转载请署名 achieverain,谢谢 经常见人问PHP程序无法设置cookie.下面把我遇见过的情况都说一遍 1 PHP程序在执行setcookie之前有输出. 解决 :    把setcooki ...

  8. Python笔记4-20151029

    一.切片 L = [''Michael','Sarah','Tracy','Bob','Jack'] 取前N个元素,也就是索引为0-(N-1)的元素,可以用循环: >>> r = [ ...

  9. 无法启动T-SQL调试。未能连接到计算机"."。这是在主机名解析时通常出现的暂时错误……

    今天在按在SSMS中,按F11进行断点调试时,弹出错误:"无法启动T-SQL调试.未能连接到计算器".".这是在主机名解析时通常出现的暂时错误--", 如下图: ...

  10. sf中标准的分页功能介绍

    世上本无事,庸人自扰之.我喜欢一个相对比较安静的环境去学习和工作,希望在一个掉一根针的声音都能够听到的环境中,但是有时候往往相反,一片嘈杂,我改变不了周围的环境,只能改变自己,其实这些都没有什么,也许 ...