音乐播放器课设报告要点
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
音乐播放器
音乐播放器
1 问题定义和可行性研究 (2)
(1)问题定义 (3)
(1)可行性研究 (3)
2 需求分析 (3)
1 功能需求 (3)
1.1 功能描述 (3)
2性能需求 (4)
3将来可能提出的要求 (4)
4项目描述 (5)
4.1 编写目的 (5)
4.2 项目背景 (5)
4.3 开发工具及环境简介 (6)
3 概要设计和详细设计 (6)
3.1 概要设计 (6)
3.2 详细设计 (7)
3.3 音乐编码设计 (8)
5主界面界面介绍 (9)
6系统的实现 (11)
一、主要的对话框 (11)
二、全局变量 (12)
三、初始化函数 (12)
三、播放、暂停功能 (15)
四、添加文件到播放列表 (18)
五、下一首\上一首 (20)
六、停止播放 (21)
七、播放模式 (21)
八、显示时间和播放进度 (22)
九、删除歌曲 (23)
5.2 单元测试 (25)
6.总结 (26)
1 问题定义和可行性研究
本章分为两部分,问题定义和可行性研究。
问题定义阶段主要研究我们所学的知识能做什么项目,而可行性研究给出了制作音乐播放器的可行性。
(1)问题定义
通过开发音乐播放器,来练习本学期软件工程课程所学知识。
熟
悉软件开发的各个阶段,将书本上的知识与实践性的开发活动联系起来。
实现音乐播放器基本的功能。
(2)可行性研究
大一的时候已经学过了基本的C++编程的知识,在这个基础上,有三个星期的时间来学习MFC编程,学习文件的读写操作,以及系
统API 函数调用等知识。
边学边用,具备开发软件的能力。
2 需求分析
本章给出了音乐播放器应该具备的功能,并给出了功能示意图,最后提出了实现该播放器应该具备的条件。
1 功能需求
1.1 功能描述
本播放器主要有如下功能:1.对文件进行操作。
2.对按钮的处理
1.对文件的操作
通过文件的读写知识,实现浏览目录以选择文件,添加歌曲到
播放列表,删除播放列表中的歌曲,对已经选中的文件进行播放、暂停,以及通过双击播放列表中的歌曲来播放文件。
2.对控件的处理
对各种按钮添加了事件响应函数,可以处理基本的播放,暂停,上一首/下一首,删除,选择播放模式等操作。
功能如下图:
2 性能需求
本项目是一个普通的音乐播放器,运行环境为VS2010,项目运行速率正常,可以满足用户需求。
1.时间性能要求:越低越好。
2.便捷性:运用了可视化编程,更有助于人机交互,更人性化。
程
序的运行,符合正常的操作习惯,程序功能明了简洁!
3 将来可能提出的要求
(1)歌曲列表的保存
(2)菜单操作
(3)更换背景图片
(4)提供网络下载功能:支持通过歌名和歌手名进行歌曲检索和下载功能;
(5)支持歌词显示和同步播放;
(6)支持歌曲在线播放;
(7)支持更友好的歌曲检索和下载功能;
(8)提供更良好的操作界面。
4项目描述
4.1 编写目的
设计一个基于windows 平台的音乐点播系统,实现音乐库的管理以及播放功能。
音乐播放器能够满足音乐的播放功能,实现一款播放器的基本功能。
4.2 项目背景
本项目作为《软件课程设计》课程的训练项目提出,在基本的设计实现基础上,将不断对已有的设计进行进一步的修改和完善,最终完成整个软件开发过程。
本次项目的旨在通过不同软件工程设
计方法与技术的实践,了解和掌握各种技术、工具平台的特点与局限性,体会协同开发方式。
第1 阶段:主要目的是通过对项目需求的分析和理解,通过面向对象的设计方式完成项目前期的准备工作。
第2 阶段:我们会根据既定需求,完善设计模式。
第3 阶段:在设计文档和需求分析的文档下,完成音乐点播系统原
型的开发,并完成整个开发流程的测试报告
第4 阶段:通过音乐点播系统软件的设计开发,了解软件文档的编
写原则,训练掌握软件各类文档写作的技巧,同时在文档的编写过
程中提高和增加C++开发的能力和经验。
4.3 开发工具及环境简介
操作系统:windows xp 或以上版本
C++ 6.0: Visual C++是一个功能强大的可视化软件开发工具。
自1993年Microsoft公司推出Visual C++1.0后,随着其新版本的不断问世,Visual C++已成为专业程序员进行软件开发的首选工具。
Microsoft Office Word 2003:经典办公软件,本项目中用于编写文档。
3 概要设计和详细设计
3.1概要设计
通过这个阶段的工作将划分出组成系统的物理元素——程序,
文件和文档等,但是每个物理元素仍然处于黑盒子级,这些黑盒子
里的具体内容将在以后仔细设计。
总体设计的另一项重要任务是设
计软件的结构,也就是要确定该软件由哪些模块组成的,以及这些
模块之间的关系。
运用传统软件工程方法学的知识将音乐播放器软件的开发分成:
一、MFC 的使用以及实现方法
二、文件的读写操作
三、系统API函数的调用
3.2 详细设计
根据概要设计所划分的四个模块,该阶段应详细地完成这四个模块的任务:
一、MFC的实现
通过MFC窗口以及函数的使用,创建出播放器的主界面,主界
面应包括文件的打开、添加、播放以及线程按键。
另外,还要各种函数应该实现相应组件上的各种事件。
二、文件读写操作的实现
通过以前的学过的文件读写操作知识,实现对音乐文件的读以及写操作。
三、系统API函数的调用
通过调用系统媒体控制接口函数实现对mp3,wav,wma等格式的音乐的播放的功能。
3.3音乐编码设计
一、编码原理
1. 音乐的十二平均率规定
(1)每两个八度音之间的频率相差一倍。
(2)两个八度音之间又可以分为十二个伴音,每两个伴音的频率比为1.059463。
(3)低音6(音名A)的频率是440Hz,音名B 到C之间、E 到F之间为伴音,其余为全音。
2. 乐谱编码
选取65536Hz为基准频率,以此频率分频得到简谱高音各音调的分频比。
计算公式为N=65536/f。
二、编码参照
为了让ROM能够识别各音频的分频系数,需将个音频分频系数按照一定格式转换成十六进制格式。
我们采用8位的
ROM,D6D5位表示高中低音,如表1-2 所示,11为高音,10为中音,01为低音;用D4D3D2D1D0位表示分频系数,将表1-1 的分频系数转换成二进制格式表示;ROM的高位全部补0。
然后转换成十六进制如表1-2 所示。
之所以采用高音分频比的二分之一为基准分频系数,是因为ROM 的位宽限制,而每两个八度音频率相差一
倍,所以我们后面用译码器译成各音频的分频系数输出给分频器,这样由分频器输出到扬声器,扬声器就可发声了。
5 主界面界面介绍
1、界面图:
2 添加歌曲按钮
3、删除歌曲按钮
4、音量的变大变小按钮
5、歌曲时间和进度的显示图像
6、下一首歌按钮
7、上一首歌按钮
8、停止播放按钮
9、播放按钮
10、单曲播放/随机播放/顺序播放按钮
11、空白部分为歌曲的菜单列表
6 系统的实现
一、主要的对话框
class CMCIPlayerDlg : public CDialogEx
{
// 构造
public:
CMCIPlayerDlg(CWnd*pParent = NULL); // 标准构造函数
// 对话框数据
enum{ IDD= IDD_MCIPLAYER_DIALOG};
protected:
virtual void DoDataExchange(CDataExchange*pDX); //
DDX/DDV 支持
// 实现
protected:
HICON m_hIcon;
// 生成的消息映射函数
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID,LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
public:
// 列表
CListBox m_list;
afx_msg void OnBnClickedOnstart();
afx_msg void OnBnClickedOnloadmusic();
void load(music a);
int isplay;
int index;
CSliderCtrl volume;
afx_msg void OnNMCustomdrawVolun(NMHDR *pNMHDR, LRESULT *pResult);
afx_msg void OnBnClickedOnnext();
afx_msg void OnBnClickedOnper();
afx_msg void OnBnClickedOnstop();
LRESULT OnMciNotify(WPARAM wParam,LPARAM lParam);//设置播放模式
afx_msg void OnBnClickedOrder();
afx_msg void OnLbnDblClk();
void OnTimer(UINT nIDEvent);
// 进度条
CSliderCtrl m_progress;
afx_msg DWORD getinfo(DWORD item);
afx_msg void OnBnClickedDeletemusic();
};
二、全局变量
struct music
{
string name;
string mPath;
};
int m_max;//进度条的最大位置变量
int hour,minute,second; //时间变量:小时、分钟、秒钟
DWORD cdlen;//某个音频文件的总时间长度
DWORD m_count;//设备型号
DWORD cdfrom,cdto;//歌曲的起点和终点
DWORD DeviceID;
list<music>mus;//全局歌曲链表
vector<CString> allpath;//保存已有的歌
三、初始化函数
BOOL CMCIPlayerDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 将“关于...”菜单项添加到系统菜单中。
//volume.SetBkColor(RGB(37,38,37));
HBITMAP hBitmap;
hBitmap= LoadBitmap(AfxGetInstanceHandle(),
MAKEINTRESOURCE(IDB_BITMAP4));
((CButton*)GetDlgItem(IDC_ONSTART))->SetBitmap(hBitmap);
hBitmap= LoadBitmap(AfxGetInstanceHandle(),
MAKEINTRESOURCE(IDB_BITMAP1));
((CButton*)GetDlgItem(IDC_ONPER))->SetBitmap(hBitmap);
hBitmap= LoadBitmap(AfxGetInstanceHandle(),
MAKEINTRESOURCE(IDB_BITMAP2));
((CButton*)GetDlgItem(IDC_ONNEXT))->SetBitmap(hBitmap);
hBitmap= LoadBitmap(AfxGetInstanceHandle(),
MAKEINTRESOURCE(IDB_BITMAP5));
((CButton*)GetDlgItem(IDC_ONSTOP))->SetBitmap(hBitmap);
hBitmap= LoadBitmap(AfxGetInstanceHandle(),
MAKEINTRESOURCE(IDB_BITMAP7));
((CButton*)GetDlgItem(IDC_ORDER))->SetBitmap(hBitmap);
SetBackgroundImage(IDB_BITMAP6,BACKGR_TILE,NULL);
isplay=0; //未播放状态
index=-1;
m_list.SetCurSel(0);//设置初始选择位置
volume.SetRange(0,1000);//滑块的移动范围0~1000
volume.SetPos(500);//滑块指针的初始位置设为500代表初始音量为50
ifstream rin; //导入原先数据
rin.open("Mylist.txt");
//int rere;
string str[2];
if(rin>>setw(50)>>str[0]>>setw(150)>>str[1])
while(!rin.eof())
{
music mu;
=str[0];
mu.mPath=str[1];
CString name;
for(int i=0;i<.length();i++)
{
if([i]=='/')
[i]='';
}
name=.c_str();
CString mPath;
for(int i=0;i<mu.mPath.length();i++)
{
if(mu.mPath[i]=='/')
mu.mPath[i]='';
}
mPath=mu.mPath.c_str();
int j=m_list.GetCount(); //把名字和地址插
入到list控件
m_list.InsertString(j,name);
//CString*p=&mPath;
allpath.push_back(mPath);
rin>>str[0]>>str[1];
}
rin.close();
//IDM_ABOUTBOX必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX& 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX< 0xF000);
CMenu* pSysMenu= GetSystemMenu(FALSE);
if(pSysMenu!= NULL)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if(!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING,
IDM_ABOUTBOX,strAboutMenu);
}
}
// 设置此对话框的图标。
当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon,TRUE); // 设置大图标
SetIcon(m_hIcon,FALSE); // 设置小图标
//TODO:在此添加额外的初始化代码
return TRUE;// 除非将焦点设置到控件,否则返回TRUE
}
三、播放、暂停功能
void CMCIPlayerDlg::OnBnClickedOnstart()//开始播放
{
//TODO:在此添加控件通知处理程序代码
if(isplay==0)
{
//TODO:在此添加控件通知处理程序代码
if(m_list.GetCurSel()==-1)//判断有没有歌曲被选中,若
没有,则从第一首开始播放-1 代表没有被选中
m_list.SetCurSel(0);
if(m_list.GetCurSel()==index)
{
SetTimer(0,1000,NULL);
mciSendCommand(DeviceID,MCI_RESUME,0,0);
HBITMAP hBitmap;
hBitmap= LoadBitmap(AfxGetInstanceHandle(),
MAKEINTRESOURCE(IDB_BITMAP3));
((CButton*)GetDlgItem(IDC_ONSTART))->SetBitmap(hBitmap);
SetDlgItemText(IDC_ONSTART,"暂停");
isplay=1;
}
else
{
index=m_list.GetCurSel();
CString data;
//m_list.GetDlgItemTextA(index,data);
//CString c=dat
MCI_OPEN_PARMS mciopenparms;//打开
MCI_PLAY_PARMS mciplayparms;//播放
second=0;minute=0;hour=0;
mciopenparms.lpstrElementName=allpath[index];//将音乐文件路
径传给设备
DWORD dwReturn;
if(dwReturn=mciSendCommand(NULL,MCI_OPEN,MCI_OPEN_ELEMENT|
MCI_WAIT,(DWORD)(LPVOID)&mciopenparms))
{
//如果打开文件失败,则将出错信息储存在buffer,并显示
出错警告
char buffer[256];
mciGetErrorString(dwReturn,buffer,256);
MessageBox(buffer,"出错警告!",MB_ICONHAND|
MB_ICONERROR|MB_ICONSTOP);
}
DeviceID=mciopenparms.wDeviceID;
mciopenparms.lpstrDeviceType=NULL;//文件类型
m_count=mciopenparms.wDeviceID;//多媒体设备类型编号
mciplayparms.dwFrom=0;//每次播放都是从0开始播放
HWND hwnd=GetSafeHwnd();
mciplayparms.dwCallback= (DWORD)hwnd;
cdlen=getinfo(MCI_STATUS_LENGTH);
CString stime;
CClientDC dc(this);
dc.SetBkColor(RGB(255,255,255));//设置放置计数器区域的外观
dc.SetTextColor(RGB(95,180,66));
stime.Format("%02d:%02d:%02d",cdlen/3600000,(cdlen
%3600000)/60000,((cdlen%3600000)%60000)/1000);//显示时间进度dc.TextOut(328,13,stime);
mciSendCommand(DeviceID,MCI_PLAY,/*MCI_FROM|*/MCI_NOTIFY, (DWORD)(LPVOID)&mciplayparms);
SetTimer(0,1000,NULL);//设置系统计数器,显示歌曲播放的进度
HBITMAP hBitmap;
hBitmap= LoadBitmap(AfxGetInstanceHandle(),
MAKEINTRESOURCE(IDB_BITMAP3));
((CButton*)GetDlgItem(IDC_ONSTART))->SetBitmap(hBitmap);
SetDlgItemText(IDC_ONSTART,"暂停");
isplay=1;
}
}
else
{
KillTimer(0);
mciSendCommand(DeviceID,MCI_PAUSE,0,0);
HBITMAP hBitmap;
hBitmap= LoadBitmap(AfxGetInstanceHandle(),
MAKEINTRESOURCE(IDB_BITMAP4));
((CButton*)GetDlgItem(IDC_ONSTART))->SetBitmap(hBitmap);
SetDlgItemText(IDC_ONSTART,"播放");
isplay=0;
}
}
四、添加文件到播放列表
void CMCIPlayerDlg::OnBnClickedOnloadmusic()//导入歌曲
{
//TODO:在此添加控件通知处理程序代码
CFileDialog dlg(
TRUE,_T("*.*"), NULL,
OFN_FILEMUSTEXIST| OFN_PATHMUSTEXIST | OFN_HIDEREADONLY,
_T("mp3文件(*.mp3)|*.mp3|"
"wma 文件(*.wma)|*.wma|"
"wav 文件(*.wav)|*.wav|"
"所有文件(*.*)|*.*|"), NULL
); // 选项图片的约定dlg.m_ofn.lpstrTitle= _T("打开音乐文件"); // 打开文件对话框
的标题名
if(dlg.DoModal()!= IDOK) // 判断是否获得图
片
return;
CString mPath=dlg.GetPathName();//获取音乐路径
CString mmpath=mPath;
allpath.push_back(mPath);
int i=mPath.ReverseFind('\\'); //从磁盘地址中获取歌曲名字
CString name;
name=mPath.Right(mPath.GetLength()-1-mPath.ReverseFind('\\'));
int j=m_list.GetCount(); // 把名字和地址插入到list 控件
m_list.InsertString(j,name);
//m_shelllist.SetItemText(j,0,name);
music mu;
=name.GetBuffer();
mu.mPath=mPath.GetBuffer();
load(mu);
}
void CMCIPlayerDlg::load(music a)
{
list<music>mus;
ifstream rin;
rin.open("Mylist.txt");
//int rere;
string str[2];
if(rin>>str[0]>>str[1])
while(!rin.eof())
{
music mu;
=str[0];
mu.mPath=str[1];
if(!=)
mus.push_back(mu);
else
{
MessageBox("已经有该歌曲");
return;
}
rin>>str[0]>>str[1];
}
rin.close();
for(int i=0;i<.length();i++) //把名
字里面的空格变为'_'
{
if([i]=='')
[i]='/';
}
for(int i=0;i<a.mPath.length();i++) //把地
址里面的空格变为'*'
{
if(a.mPath[i]=='')
a.mPath[i]='/';
}
mus.push_back(a);
ofstream out("Mylist.txt");
list<music>::iterator it=mus.begin();
while(it!=mus.end())
{
out<<left<<setw(50)<<(*it).name<<""<<setw(150)<<
(*it).mPath
<<endl;
it++;
}
out.close();
}
五、下一首\上一首
void CMCIPlayerDlg::OnBnClickedOnnext()//下一首
{
//TODO:在此添加控件通知处理程序代码
KillTimer(0);
second=0;minute=0;hour=0;
mciSendCommand(DeviceID,MCI_CLOSE,0,0);//在加载文件前先清空上一次播放的设备
isplay=0;
index=m_list.GetCurSel();
if(index+1==m_list.GetCount())
{
m_list.SetCurSel(0);
}
else
{
m_list.SetCurSel(index+1);
}
OnBnClickedOnstart();
isplay=1;
}
void CMCIPlayerDlg::OnBnClickedOnper()//上一首
{
//TODO:在此添加控件通知处理程序代码
KillTimer(0);
second=0;minute=0;hour=0;
mciSendCommand(DeviceID,MCI_CLOSE,0,0);//在加载文件前先清空上一次播放的设备
isplay=0;
index=m_list.GetCurSel();
if(index==0)
{
m_list.SetCurSel(m_list.GetCount()-1);
}
else
{
m_list.SetCurSel(index-1);
}
OnBnClickedOnstart();
isplay=1;
}
六、停止播放
void CMCIPlayerDlg::OnBnClickedOnstop()//停止
{
//TODO:在此添加控件通知处理程序代码
KillTimer(0);
second=0;minute=0;hour=0;
mciSendCommand(DeviceID,MCI_CLOSE,0,0);//在加载文件前先清空上一次播放的设备
isplay=0;
SetDlgItemText(IDC_ONSTART,"播放");
HBITMAP hBitmap;
hBitmap= LoadBitmap(AfxGetInstanceHandle(),
MAKEINTRESOURCE(IDB_BITMAP4));
((CButton*)GetDlgItem(IDC_ONSTART))->SetBitmap(hBitmap);
index=-1;
UpdateData(false);
}
七、播放模式
void CMCIPlayerDlg::OnBnClickedOrder()//设置播放模式
{
//TODO:在此添加控件通知处理程序代码
CString pattern;
GetDlgItemText(IDC_ORDER,pattern);
if(pattern=="顺序")
{
SetDlgItemText(IDC_ORDER,"随机");
HBITMAP hBitmap;
hBitmap= LoadBitmap(AfxGetInstanceHandle(),
MAKEINTRESOURCE(IDB_BITMAP8));
((CButton*)GetDlgItem(IDC_ORDER))->SetBitmap(hBitmap);
}
if(pattern=="随机")
{
SetDlgItemText(IDC_ORDER,"单曲");
HBITMAP hBitmap;
hBitmap= LoadBitmap(AfxGetInstanceHandle(),
MAKEINTRESOURCE(IDB_BITMAP9));
((CButton*)GetDlgItem(IDC_ORDER))->SetBitmap(hBitmap);
}
if(pattern=="单曲")
{
SetDlgItemText(IDC_ORDER,"顺序");
HBITMAP hBitmap;
hBitmap= LoadBitmap(AfxGetInstanceHandle(),
MAKEINTRESOURCE(IDB_BITMAP7));
((CButton*)GetDlgItem(IDC_ORDER))->SetBitmap(hBitmap);
}
}
八、显示时间和播放进度
void CMCIPlayerDlg::OnTimer(UINT nIDEvent)
{ CString stime;
second++;
CClientDC dc(this);
dc.SetBkColor(RGB(255,255,255));//设置放置计数器区域的外观dc.SetTextColor(RGB(95,180,66));
if(second==60)//设置钟表的显示
{minute++;second=0;
}
if(minute==60)
{hour++;minute=0;
}
if(hour==24)
{hour=0;
}
stime.Format("%02d:%02d:%02d",hour,minute,second);//显示时间
进度
dc.TextOut(68,13,stime);
m_progress.SetRange(0,cdlen);//使进度条的范围与歌曲时间一致
UpdateData(false);
m_max=cdfrom;//保存歌曲的当前位置信息
if(m_max!=cdlen)//如果歌曲结束,则进度条重新置0
{m_progress.SetPos(cdfrom);}
else {m_progress.SetPos(0);
m_max=0;
OnBnClickedOnstop();
}
DWORD cdf=getinfo(MCI_STATUS_POSITION);
cdfrom=MCI_MAKE_MSF(MCI_MSF_MINUTE(cdf),MCI_MSF_SECOND(cdf), MCI_MSF_FRAME(cdf));//获取当前播放文件的信息
UpdateData(false);
CDialog::OnTimer(nIDEvent);
九、删除歌曲
void CMCIPlayerDlg::OnBnClickedDeletemusic()//删除歌曲
{
//TODO:在此添加控件通知处理程序代码
if(m_list.GetCurSel()==-1)
MessageBox("请选中要删除的歌曲");
else
{
CString na;
int i=m_list.GetCurSel();
na=allpath[i];
allpath.erase(allpath.begin()+i);
m_list.DeleteString(i);
UpdateData(false);
string pa=na.GetBuffer();
for(int i=0;i<pa.length();i++)//把地址里面的空格
变为'*'
{
if(pa[i]==' ')
pa[i]='/';
}
list<music>mus;
ifstream rin;
rin.open("Mylist.txt");
//int rere;
string str[2];
if(rin>>str[0]>>str[1])
while(!rin.eof())
{
music mu;
=str[0];
mu.mPath=str[1];
if(mu.mPath!=pa)
mus.push_back(mu);
rin>>str[0]>>str[1];
}
rin.close();
ofstream out("Mylist.txt");
list<music>::iterator it=mus.begin();
while(it!=mus.end())
{
out<<left<<setw(50)<<(*it).name<<""<<setw(150)<<
(*it).mPath
<<endl;
it++;
}
out.close();
}
}
5.2 单元测试
初始界面:
初始界面由一个七个按钮控件,一个列表控件,一个进度条控件组成。
当点击添加歌曲按钮时,弹出文件对话框
弹出的文件对话框
6.总结
自制音乐播放器是运行于VS2010的一款MFC应用程序,该软
件通过运用平时所学的知识,把文件的创建、读写操作,MFC控件
的使用,系统的MCI函数的知识系统地联系在了一起。
播放器通过文件的读写知识,实现了对音乐文件的添加、删除
等操作;通过系统MCI函数,支持MP3,WAV,WMA等格式的音乐
文件的播放,而在主界面程序中只是调用这些功能函数,有助于对软件进行更新操作;另外,该软件运用了MFC的知识,实现了按钮,
列表框等控件的使用,通过使用事件处理机制,实现了各种按键上
的动作事件。
因此,该播放器能够更好地练习本学期所学的各种知识,通过该播放器的开发,回顾了文件的各种操作,加深了对MFC 的认识,尤其是对软件开发的各个过程有了较详细的了解。