最近研究了一下MFC下的音乐的播放,主要使用了MCI

1.需要包含的库文件

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

2.包含的头文件

  1. #include <mmsystem.h>
  2.  
  3. #include "stdafx.h"
  4.  
  5. #include "vfw.h"
  6.  
  7. #include <digitalv.h>
  8.  
  9. #pragma comment(lib,"winmm.lib")

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

  1. class CMp3Dlg : public CDialog
  2. {
  3. // Construction
  4. public:
  5. CMp3Dlg(CWnd* pParent = NULL); // standard constructor
  6.  
  7. // Dialog Data
  8. //{{AFX_DATA(CMp3Dlg)
  9. enum { IDD = IDD_MP3_DIALOG };
  10. CButton m_Play;
  11. CString m_Path;
  12. //}}AFX_DATA
  13.  
  14. // ClassWizard generated virtual function overrides
  15. //{{AFX_VIRTUAL(CMp3Dlg)
  16. protected:
  17. virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
  18. //}}AFX_VIRTUAL
  19.  
  20. // Implementation
  21. protected:
  22. HICON m_hIcon;
  23.  
  24. // Generated message map functions
  25. //{{AFX_MSG(CMp3Dlg)
  26. virtual BOOL OnInitDialog();
  27. afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
  28. afx_msg void OnPaint();
  29. afx_msg HCURSOR OnQueryDragIcon();
  30. afx_msg void OnButtonOpenFile();
  31. afx_msg void OnButtonPlayMusic();
  32. afx_msg void OnButtonCyclePlay();
  33. afx_msg void OnMciNotify(WPARAM wParam,LPARAM lParam);
  34. //}}AFX_MSG
  35. DECLARE_MESSAGE_MAP()
  36.  
  37. public:
  38. void CyclePlay();
  39.  
  40. private:
  41. HWND m_video;
  42. BOOL Pause;
  43.  
  44. MCIDEVICEID m_wID;
  45. };

4.添加消息响应

  1. BEGIN_MESSAGE_MAP(CMp3Dlg, CDialog)
  2. //{{AFX_MSG_MAP(CMp3Dlg)
  3. ON_WM_SYSCOMMAND()
  4. ON_WM_PAINT()
  5. ON_WM_QUERYDRAGICON()
  6. ON_BN_CLICKED(IDC_BUTTON_OPEN, OnButtonOpenFile)
  7. ON_BN_CLICKED(IDC_BUTTON_PLAY, OnButtonPlayMusic)
  8. ON_BN_CLICKED(IDC_BUTTON_CYCLE_PLAY, OnButtonCyclePlay)
  9. ON_MESSAGE(MM_MCINOTIFY,OnMciNotify)
  10. //}}AFX_MSG_MAP
  11. END_MESSAGE_MAP()

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

  1. void CMp3Dlg::OnButtonOpenFile()
  2. {
  3. // TODO: Add your control notification handler code here
  4. TCHAR szBuffer[MAX_PATH] = {};
  5. BROWSEINFO bi;
  6. ZeroMemory(&bi,sizeof(BROWSEINFO));
  7. bi.hwndOwner = NULL;
  8. bi.pszDisplayName = szBuffer;
  9. bi.lpszTitle = _T("从下面选择文件或者文件夹:");
  10. bi.ulFlags = BIF_BROWSEINCLUDEFILES;
  11. LPITEMIDLIST idl = SHBrowseForFolder(&bi);
  12.  
  13. if (NULL == idl)
  14. {
  15. return;
  16. }
  17. SHGetPathFromIDList(idl,szBuffer);
  18. }

方法二:

  1. void CMp3Dlg::OnButtonOpenFile()
  2. {
  3. m_video = NULL;
  4. if (m_video == NULL)
  5. {
  6. CFileDialog filedialog(TRUE,NULL,NULL,OFN_HIDEREADONLY,"MP3 Files (*.mp3)|*.mp3|");
  7. if (filedialog.DoModal() == IDOK)
  8. {
  9. m_Path = filedialog.GetPathName();
  10. UpdateData(FALSE);
  11. }
  12. }
  13. }

6.音乐的播放
方法一:

  1. void CMp3Dlg::OnButtonPlayMusic()
  2. {
  3. // TODO: Add your control notification handler code here
  4. m_video = NULL;
  5. if(m_video == NULL)
  6. {
  7. m_video = MCIWndCreate(this->GetSafeHwnd(),
  8. AfxGetInstanceHandle(),
  9. WS_CHILD | WS_VISIBLE|MCIWNDF_NOMENU,m_Path);
  10. }
  11. else
  12. {
  13. MCIWndHome(m_video);
  14. }
  15. MCIWndPlay(m_video);
  16. m_Play.EnableWindow(FALSE);
  17. }

方法二:

  1. void CMp3Dlg::OnButtonCyclePlay()
  2. {
  3. // TODO: Add your control notification handler code here
  4. MCI_OPEN_PARMS mciOP;
  5. DWORD dwReturn;
  6.  
  7. //ASSERT(m_wID == NULL);
  8.  
  9. mciOP.lpstrDeviceType = NULL;
  10. mciOP.lpstrElementName = m_Path;
  11. dwReturn = mciSendCommand(,
  12. MCI_OPEN,
  13. MCI_OPEN_ELEMENT|MCI_WAIT|MCI_OPEN_SHAREABLE,
  14. (DWORD)(LPVOID)&mciOP);
  15.  
  16. if (dwReturn == )
  17. {
  18. m_wID = mciOP.wDeviceID;
  19. }
  20. else
  21. {
  22. m_wID = NULL;
  23. }
  24.  
  25. CyclePlay();
  26. }
  27.  
  28. void CMp3Dlg::CyclePlay()
  29. {
  30. MCI_PLAY_PARMS PlayParms;
  31. PlayParms.dwCallback = (DWORD)GetSafeHwnd();
  32. PlayParms.dwFrom = ;
  33. //mciSendCommand(m_wID,MCI_PLAY,MCI_DGV_PLAY_REPEAT,(DWORD)(LPVOID)&PlayParms);
  34. mciSendCommand(m_wID,MCI_PLAY,MCI_NOTIFY,(DWORD)(LPVOID)&PlayParms);
  35. }

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行

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

  1. void CMp3Dlg::OnMciNotify(WPARAM wParam,LPARAM lParam)
  2. {
  3. if(MCI_NOTIFY_SUCCESSFUL == wParam)
  4. {
  5. //mciSendCommand(m_wID,MCI_CLOSE,0,NULL);
  6. //CyclePlay();
  7. MCI_PLAY_PARMS PlayParms;
  8. PlayParms.dwFrom = ;
  9. PlayParms.dwCallback = (DWORD)m_hWnd;
  10. mciSendCommand(m_wID, MCI_SEEK,MCI_SEEK_TO_START, NULL);
  11. mciSendCommand(m_wID, MCI_PLAY, MCI_NOTIFY, (DWORD)(LPVOID)&PlayParms);
  12. }
  13. }

以上所述经过测试!

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. iOS缓存

    存储缓存: 第三方应用只能把信息保存在应用程序的沙盒中.因为缓存数据不是用户产生的,所以它应该被保存在NSCachesDirectory,而不是NSDocumentsDirectory.为缓存数据创建 ...

  2. Ubuntu火狐、Chromium等浏览器安装flash插件

    1.打开系统设置->软件和更新->其他软件,勾选Canonical合作伙伴,输入密码,重新载入更新 2.打开终端,按装插件 sudo apt install adobe-flashplug ...

  3. sim808模块收发送短信

    一,简介 SIM 808发送短信分text模式和PDU模式.text模式已ascii码发送短信,这种模式比较简单,发送命令AT+CMGF=1就可以发送短信,而PDU模式比较复杂,首先发送命令AT+CM ...

  4. MAMP、wordpress安装

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; text-align: center; font: 12.0px Helvetica } p.p4 { margin: ...

  5. js 冒泡排序

    var arr = []; for(var i=0; i<100000; i++){ arr.push(parseInt(Math.random()*100)) }; var t1 = Date ...

  6. 子字符查找KMP算法 - 子串自匹配索引表

    public static int[] kmpTable(char[] seq) { int[] tbl = new int[seq.length]; tbl[0] = 1; for (int i = ...

  7. 【Python之路】第八篇--Python基础之网络编程

    Socket socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. sock ...

  8. 前端好的工具集推荐 lodash

    原来用 backbone 的时候, 感觉 underscore 是一个好的工具集,顿时感觉不错,不用自己一直去封装一些组件. 直到我遇到了 lodash,一只发现 web 项目中有依赖这个库的,但是一 ...

  9. spring可以get到bean,注入却为空

    使用spring的时候,已经将要用的bean注入到容器之中却发现在程序中总是报null,后来发现是因为当前的启动类没有在容器之中,所以用上下文可以get到,但是注入却无效

  10. 本地yum库的搭建

    1.建立yum服务器 yum服务器可以使用http或者ftp的方式,我们这里选择使用http的方式进行,需要先进行httpd的安装 # yum install httpd 在本地建立包目录 # mkd ...