最近研究了一下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. 图片上传插件用法,JS语法【三】

    注意点: 作为文件域(<input type="file">)必须要有name属性,如果没有name属性,上传之后服务器是获取不到图片的.如:正确的写法是<inp ...

  2. WinForm 布局,容器、打印和对话框控件

    今天,我主要学习了容器控件.打印控件.对话框控件. 在正式进行今天的内容之前,首先补充了布局的两个属性:Anchor:锁定位置,Dock:填充位置,一般与容器控件配合使用. 之后,我学习了第一部分内容 ...

  3. Java之IO流

    目录: 1.文件编码 2.File类 3.RandomAccessFile 4.字节流 5.字符流 6.对象的序列化和反序列化 1.文件编码 1)相关知识点 八进制和十六进制的表示方式:八进制前面加0 ...

  4. 微信小程序文档解读(一)--api提供支持有哪些

    本文重点在于小程序API提供的微信功能支持及获取用户信息的解读,具体的用法和调用不在本文讨论范围之内,文章基于20161222版文档解读 API官方文档原文链接 小程序API官方定义: 框架提供丰富的 ...

  5. iherb账户

    LMJ997 23622335@qq.com yjxwly***** LUR472 13821660226@163.com linda**** LFW887 bella****

  6. expri on the testdisk

    首先,根据GNU的编译知识,来分析下载下来的目录,虽然里面有很多win的,andriod的文件,就不要管了,考入centos里面去, 按下面顺序执行就ok了. 第一步执行顺序: #autoscan   ...

  7. StackExchange.Redis 基本使用 (一) (转)

    StackExchange.Redis下载地址: https://github.com/StackExchange/StackExchange.Redis/blob/master/Docs/Basic ...

  8. iOS 富文本点击事件

    #import "ViewController.h" #define font 17 @interface ViewController ()<UITextViewDeleg ...

  9. jfinal获取服务器的IP和端口

    String serverIp = getRequest().getServerName(); Integer serverPort = getRequest().getServerPort();

  10. 关于微信端不支持window.location.reload()

    今天写了一个调查问卷页面,项目经理说要表单提交之后页面刷新,之间没沟通清楚,以为整个页面重载,所以刚开始就用了window.location.reload()的方法. 但是发现,在微信直接打开之后,居 ...