本节目录:
1. 完整主界面控件解释说明
2.最简音乐播放器界面设计与类成员变量添加
3. 功能代码实现
4. 演示
回顾上一节内容,刚开始演示了播放器主界面,随后,对播放器所使用到的核心API函数做了基本的说明演示!那么在主界面中具体涉及到哪些控件,以及位置如何摆放呢?
1. 完整主界面控件解释说明
还是一样的,首先贴出完整的主界面控件图。位置及界面控件可自定义,并无严格的要求!
① 列表框控件(ListBox Control)
② 图片控件(Picture Control)
③ 滑块控件(Slider Control)
④ 组合框控件(Combo-box Control)
⑤ 按钮控件(Button Control)
⑥ 单选按钮控件(Radio-button Control)
⑦ 分组控件(Group box Control)
⑧ 其他的空白及文字部分统一用的静态文本控件(Static Text Control)
限于篇幅,这里就只列举出控件名称,各个控件的大概用法会在后面做出一定说明,想了解详细功能用法的可自行搜索!
2.最简音乐播放器界面设计与类成员变量添加
下面我们利用MFC创建对话框程序,并对上节提到的音乐播放功能做出改进!(由于VS2017安装完成之后,VC6.0失效了,因此后面的项目内容统一采用Visual Studio 2017)
①创建MFC应用程序项目工程,并取名为MusicPlayer。
具体参数设置如下:
应用程序类型:基于对话框(方便设计界面)。
MFC的使用:在静态库中使用MFC(编译得到的程序可自由地在其他PC电脑上运行,不需要装额外的MFC运行环境)。
其他的保持默认。
②利用向导生成MFC应用程序并自定义程序界面
③利用类向导添加相应的成员变量和对应消息响应函数
(对于vs2017而言,可在菜单项目->类向导中进入添加)
控件说明:
添加Static Text静态文本控件,标题文字设置为:“文件路径:”。
添加Edit文本编辑控件,ID设置为ID_EDITPATH,成员变量设置为CString m_strPath。
添加Static Text静态文本控件,标题文字留空,ID设置为IDC_STATICNOWPLAYPATH,成员变量设置为CString m_strNowPlayPath。
添加Button按钮控件,标题文字设置为:选择音乐文件,ID设置为IDC_BUTTONSEL
更改确认按钮文字显示为播放,ID设置为IDPLAY。取消按钮文字设置为停止,ID 设置为IDSTOP。播放按钮成员变量设置为:CButton m_btnPlay;
利用类向导生成按钮点击响应函数。
Void OnClickedButtonsel();//文件选择
Void OnClickedIdplay();//播放按钮
Void OnClickedIdstop();//停止按钮
3.功能代码实现
在MusicPlayerDlg.h中有如下几个成员变量:
public:
CString m_strPath;
CString m_strNowPlayPath;
afx_msg void OnClickedButtonsel();
afx_msg void OnBnClickedOk();
afx_msg void OnBnClickedCancel();
private:
// 音乐播放状态
//0 初始状态 1 音乐文件打开或停止状态 2 音乐文件播放状态 3 音乐文件暂停状态
int m_PlayStatus;
public:
afx_msg void OnDestroy();
CButton m_btnPlay;
afx_msg void OnClickedIdplay();
afx_msg void OnClickedIdstop();
在MusicPlayerDlg.cpp文件中,各响应函数的代码为:
BOOL CMusicPlayerDlg::OnInitDialog()//对话框初始化
{
CDialogEx::OnInitDialog();
...........//中间系统自动生成的代码省略
// 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
// TODO: 在此添加额外的初始化代码
m_PlayStatus = 0; //音乐文件状态初始化代码
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
void CMusicPlayerDlg::OnClickedButtonsel()//文件选择
{
// TODO: 在此添加控件通知处理程序代码
/*
CFileDialog MFC中的文件打开保存对话框,CFileDialog的构造函数原型为:
*/
CFileDialog fdlg(TRUE,_T(".mp3"), NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_ALLOWMULTISELECT, _T("歌曲(.mp3)|*.mp3||"), NULL);
if(fdlg.DoModal()==IDOK)
{
CString cmd = _T("");//定义命令字符串
m_strPath = fdlg.GetPathName();//获取文件对话框选择的文件全路径
TCHAR ShortPath[MAX_PATH] = _T("");
GetShortPathName(m_strPath, ShortPath, MAX_PATH);//将全路径转化为短路径
//如果文件处于打开或者其他状态 先关闭已打开的文件后再打开新选择的音乐文件
if (m_PlayStatus !=0)
{
cmd = _T("close music");
if (mciSendString(cmd, NULL, 0, NULL) == 0)
{
m_PlayStatus = 0;//设置音乐文件状态为初始状态
m_strNowPlayPath = _T("歌曲文件已关闭");
UpdateData(FALSE);
}
else
{
MessageBox(_T("音乐文件关闭错误"));
}
}
//如果文件处于初始状态状态 直接打开音乐文件
if (m_PlayStatus == 0)
{
// MessageBox(ShortPath);
/*
特别提示:在win7及以下系统中 利用GetShortPathName获取文件短路径后即可直接播放,
但在win10系统中如果遇到文件中含有空格会出错,因此,对于win10系统,音乐文件全路径需要用""包含
*/
cmd.Format(_T("open \"%s\" alias music"), ShortPath);//字符串拼接 open 音乐文件全路径 alias 文件别名
MCIERROR r = mciSendString(cmd, NULL, 0, NULL);
if ( r== 0)
{
m_PlayStatus = 1;
m_strNowPlayPath = _T("歌曲已选泽");
UpdateData(FALSE);
}
else
{
TCHAR erStr[MAX_PATH] = _T("");
mciGetErrorString(r, erStr, MAX_PATH);//如果文件打开遇到错误,输出错误提示语句
MessageBox(erStr);
MessageBox(_T("音乐文件打开错误"));
}
}
}
}
void CMusicPlayerDlg::OnClickedIdplay()//音乐播放暂停
{
// TODO: 在此添加控件通知处理程序代码
CString cmd = _T("");
switch (m_PlayStatus)
{
case 1://文件打开状态播放音乐
cmd = _T("play music");
if (mciSendString(cmd, NULL, 0, NULL) == 0)
{
m_PlayStatus = 2;//状态设置为播放状态
m_strNowPlayPath = _T("正在播放歌曲!");
m_btnPlay.SetWindowTextW(_T("暂停"));//设置按钮文本显示为暂停
UpdateData(FALSE);
}
else
{
MessageBox(_T("音乐播放错误"));
}
break;
case 2://文件播放状态暂停音乐
cmd = _T("pause music");
if (mciSendString(cmd, NULL, 0, NULL) == 0)
{
m_PlayStatus = 3;//状态设置为暂停状态
m_strNowPlayPath = _T("音乐暂停!");
m_btnPlay.SetWindowTextW(_T("播放"));//设置按钮文本显示为播放
UpdateData(FALSE);
}
else
{
MessageBox(_T("音乐暂停错误"));
}
break;
case 3:
cmd = _T("resume music");
if (mciSendString(cmd, NULL, 0, NULL) == 0)
{
m_PlayStatus = 2;//状态恢复为播放状态
m_strNowPlayPath = _T("正在播放歌曲!");
m_btnPlay.SetWindowTextW(_T("暂停"));//设置按钮文本显示为暂停
UpdateData(FALSE);
}
else
{
MessageBox(_T("音乐恢复播放错误"));
}
break;
}
}
void CMusicPlayerDlg::OnClickedIdstop()//音乐停止
{
CString cmd = _T("seek music to start");//seek 命令使音乐文件进度归0 并停止播放
if (mciSendString(cmd, NULL, 0, NULL) == 0)
{
m_PlayStatus = 1;//状态设置为文件打开或停止状态
m_btnPlay.SetWindowTextW(_T("播放"));
m_strNowPlayPath = _T("正在播放歌曲!");
UpdateData(FALSE);
}
else
{
MessageBox(_T("音乐停止播放错误"));
}
// TODO: 在此添加控件通知处理程序代码
}
void CMusicPlayerDlg::OnDestroy()//窗口销毁 程序退出
{
CDialogEx::OnDestroy();
CString cmd = _T("close music");
if (mciSendString(cmd, NULL, 0, NULL) == 0)
{
m_PlayStatus = 0;//状态设置为初始状态 虽然程序直接退出了加不加并没有什么用
}
else
{
MessageBox(_T("音乐文件关闭错误"));
}
// TODO: 在此处添加消息处理程序代码
}
CFileDialog类补充说明:
CFileDialog构造函数原型如下:
CFileDialog::CFileDialog( BOOL bOpenFileDialog, LPCTSTR lpszDefExt = NULL,LPCTSTR lpszFileName = NULL,
DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
LPCTSTR lpszFilter = NULL, CWnd* pParentWnd = NULL );
参数意义如下:
bOpenFileDialog 为TRUE则显示打开对话框,为FALSE则显示保存对话文件对话框。
lpszDefExt 指定默认的文件扩展名。例如:“.mp3”
lpszFileName 指定默认的文件名。一般保存对话框用的比较多
dwFlags 指明一些特定风格。 (默认OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT)
lpszFilter 指明可供选择的文件类型和相应的扩展名。
pParentWnd 为父窗口指针。
扩展名应遵循下面的格式:
"mp3文件 (*.mp3)|*.mp3| wav (*.wav)|*.wav| 音乐文件 (*.mp3;*.wav)|*.mp3 ; *.wav| All Files (*.*)|*.*||";
文件类型说明和扩展名间用 | 分隔,同种类型的文件扩展名之间可以用 ; 来分割,不用文件类型之间用 | 分隔,末尾用 || 指明结束。
更多详细使用方法可自行搜索CFileDialog。
也可参考站内教程:
学习心得之六,MFC编程中两种文件对话框的浅出
4.功能演示
点击了文件选择之后:
文件选择后点击播放按钮:
至此:一个最简单的带界面的音乐播放器就这样形成了!由于之前的VC6.0编写的音乐播放器过于杂乱,不利于分享代码!因此,只好利用vs2017重写一遍!后面功能的添加及代码实现,都会在今天的这个最简播放器的基础上实现,俗话说万地高楼平地起!只能慢慢添砖加瓦了!毕竟都是自学的,每个小节中难免会有些不足及错误之处!敬请谅解!
下一节目测会优化界面,添加音乐文件列表控件及菜单功能!