MFC简单音乐播放器项目报告.docx
- 文档编号:9820601
- 上传时间:2023-05-21
- 格式:DOCX
- 页数:25
- 大小:580.73KB
MFC简单音乐播放器项目报告.docx
《MFC简单音乐播放器项目报告.docx》由会员分享,可在线阅读,更多相关《MFC简单音乐播放器项目报告.docx(25页珍藏版)》请在冰点文库上搜索。
MFC简单音乐播放器项目报告
软件学院
项目报告书
课 程:
专业实训二
项目名称:
自制音乐播放器
专业年级:
软件工程Java2级
姓名:
******
学号:
*********
指导教师:
马飞
2011年12月25
目录
1问题定义与可行性研究3
1.1问题定义3
1.2可行性研究3
2需求分析4
2.1功能需求4
2.1.1功能描述4
2.1.2功能示意图5
2.2性能需求6
3概要设计与详细设计7
3.1概要设计7
3.2详细设计7
4系统实现与单元测试9
4.1源程序代码9
4.2单元测试效果图16
4.2.1MFC组件的使用16
4.2.2文件的读写操作19
4.2.3动态数据连接库的使用20
4.2.4多线程的使用21
5总结22
致谢23
参考文献24
1问题定义与可行性研究
本章分两部分,问题定义和可行性研究。
问题定义阶段主要研究我们所学的知识能做什么项目,而可行性研究给出了制作音乐播放器可行性。
1.1问题定义
通过开发音乐播放器,来练习本学期所学知识,如:
文件的创建、读写等操作,存取系统所需要的数据;使用DLL软件开发理念,实现软件的升级功能;将所有的功能函数代码尽量写到dll文件中,而在主界面程序中只是调用这些功能函数;使用多线程进行大规模运算或定时提醒等。
1.2可行性研究
本学期,主要学习了MFC编程、动态链接库、以及多线程的相官知识,在学习的过程中复习了文件的读写操作。
该音乐播放器应具备文件的读写操作、动态链接库的更新以及多线程的功能。
通过本学期的知识,已经具备开发该软件的能力。
2需求分析
本章给出了音乐播放器应该具备的功能,并给出了功能示意图,最后提出了实现该播放器应该具备的条件。
2.1功能需求
2.1.1功能描述
本播放器主要有三种功能:
第一、对文件进行操作;第二、对按钮的处理;第三、定时关闭文件。
①对文件的操作
通过文件的读写知识,实现了对文件的浏览,在窗口中删除已经选取的歌曲,清空原有的列表框,对已经选中的mp3格式的文件进行播放,以及通过双击列表框中的歌曲来播放相应的文件。
②对按键的处理
对各种按键创建了类向导,并添加了事件处理,可以处理基本的浏览、播放、删除、清空等操作。
③定时关闭播放器
本播放器通过多线程的知识,创建一个Timer线程,当按下定时关闭的按键的时候,定时关闭该音乐播放器。
④动态数据库的使用
播放器要能够包含动态数据库的知识
2.1.2功能示意图
各模块间的调用关系如下图:
2.2性能需求
本项目是一个普通的音乐播放器,运行环境为VC++6.0,项目运行速率正常,可以满足用户需求。
1、时间特性要求:
响应时间要低于5秒
2、便捷性:
运用了可视化编程,更有助于人机交互,更人性化。
程序的运行,符合正常的操作习惯,程序功能明了简洁!
3、通过线程的控制,当用户长时间不使用播放器时,定时关闭音乐播放器,更适合用户的习惯,并达到节省内存的目的。
3概要设计与详细设计
本章通过传统软件工程方法学的模块化的理论,首先概要设计出该软件应该具备的各种主要功能,然后详细的设计出各个独立模块应有的功能。
3.1概要设计
运用传统软件工程方法学的知识将音乐播放器软件的开发分成四大块:
一、MFC的使用以及实现方法
二、文件的读写操作
三、动态数据连接库的使用
四、多线程机制的使用
3.2详细设计
根据概要设计所划分的四个模块,该阶段应详细的完成这四个模块的任务:
一、MFC的实现
通过MFC窗口以及函数的使用,创建出播放器的主界面,主界面应包括文件的打开、添加、播放以及线程按键。
另外,还要各种函数应该实现相应组件上的各种事件。
二、文件读写操作的实现
通过以前的学过的文件读写操作知识,实现对音乐文件的读以及写操作,使用读写操作函数时应该注意C语言与MFC语法的相似性以及相异性。
三、动态数据连接库的实现
当删除列表中的某一歌曲或者清空列表时,调用原有的数据连接库,从而实现动态链接库的使用。
四、线程的实现
通过计时器线程Timer类,定时监视界面,并在规定的时间内自动关闭程序,达到定时关闭的目的
4系统实现与单元测试
4.1源程序代码
//初始类
classCPlayerDlg:
publicCDialog
{
//Construction
public:
CPlayerDlg(CWnd*pParent=NULL);//standardconstructor
CMenumenu;
CStringpathnames[100];
inttop;
CToolTipCtrlm_tool;
HMODULEm_hMod;
//Timer线程
intCurTime;
intStopTime;
//DialogData
//{{AFX_DATA(CPlayerDlg)
enum{IDD=IDD_PLAYER_DIALOG};
CButtonm_delete;
CCheckListBoxm_list;
CWMPPlayer4m_player;
//}}AFX_DATA
//ClassWizardgeneratedvirtualfunctionoverrides
//{{AFX_VIRTUAL(CPlayerDlg)
public:
virtualBOOLPreTranslateMessage(MSG*pMsg);
protected:
virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDVsupport
//}}AFX_VIRTUAL
//Implementation
protected:
HICONm_hIcon;
//Generatedmessagemapfunctions
//{{AFX_MSG(CPlayerDlg)
virtualBOOLOnInitDialog();
afx_msgvoidOnSysCommand(UINTnID,LPARAMlParam);
afx_msgvoidOnPaint();
afx_msgHCURSOROnQueryDragIcon();
afx_msgvoidOnMenuitem32771();
afx_msgvoidOnMenuitem32772();
afx_msgvoidOnButton1();
afx_msgvoidOnButton2();
afx_msgvoidOnButton3();
afx_msgvoidOnButton4();
afx_msgvoidOnDblclkList1();
afx_msgvoidOnButton5();
afx_msgvoidOnOpenStateChangeOcx1(longNewState);
afx_msgvoidOnButton6();
afx_msgvoidOnTimer(UINTnIDEvent);
DECLARE_EVENTSINK_MAP()
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CPlayerDlg:
:
CPlayerDlg(CWnd*pParent/*=NULL*/)
:
CDialog(CPlayerDlg:
:
IDD,pParent)
{
//{{AFX_DATA_INIT(CPlayerDlg)
//NOTE:
theClassWizardwilladdmemberinitializationhere
//}}AFX_DATA_INIT
//NotethatLoadIcondoesnotrequireasubsequentDestroyIconinWin32
m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
voidCPlayerDlg:
:
DoDataExchange(CDataExchange*pDX)
{
CDialog:
:
DoDataExchange(pDX);
//{{AFX_DATA_MAP(CPlayerDlg)
DDX_Control(pDX,IDC_BUTTON3,m_delete);
DDX_Control(pDX,IDC_LIST1,m_list);
DDX_Control(pDX,IDC_OCX1,m_player);
//}}AFX_DATA_MAP
}
//打开按键
voidCPlayerDlg:
:
OnButton1()
{
CFileDialogFD(true,"","",OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
"mp3|*.mp3;avi|*.avi;ape|*.ape||");
if(FD.DoModal()==IDOK)
{
CStringpathname=FD.GetPathName();
pathnames[top]=pathname;
m_list.AddString(pathnames[top]);
top++;
m_list.SetItemHeight(top,20);
FILE*fp1=NULL;
fp1=fopen("pathnames.txt","w");
for(inti=0;i fprintf(fp1,"%s\t",pathnames[top]); } fclose(fp1); m_player.SetUrl(pathname); } } //添加按键 voidCPlayerDlg: : OnButton2() { CFileDialogFD(true,"","",OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, "mp3|*.mp3||"); if(FD.DoModal()==IDOK) { CStringpathname=FD.GetPathName(); pathnames[top]=pathname; m_list.AddString(pathnames[top]); top++; m_list.SetItemHeight(top,20); FILE*fp1=NULL; if((fp1=fopen("pathnames.txt","w"))==NULL)MessageBox("正在播放,不能删除! ",NULL,0); for(inti=0;i fprintf(fp1,"%s\t",pathnames[top]); } fclose(fp1); } } //删除按键(动态数据连接库) voidCPlayerDlg: : OnButton3() { intitemCount=m_list.GetCount(); FILE*fp1=NULL; CStringpathname=""; fp1=fopen("pathnames.txt","w"); for(inti=0;i if(m_list.GetCheck(i)==BST_CHECKED){ m_list.DeleteString(i);top--; } } itemCount=m_list.GetCount(); for(i=0;i m_list.GetText(i,pathname); fprintf(fp1,"%s\t",pathname); } fclose(fp1); } //清空按键(动态数据连接库) voidCPlayerDlg: : OnButton4() { if(m_hMod) { ShowshowDlg; showDlg=(Show)GetProcAddress(m_hMod,"showClearMessage"); if(showDlg) { showDlg("清空"); } } top=0; FILE*fp1=NULL; fp1=fopen("pathnames.txt","w"); fclose(fp1); m_list.ResetContent(); } //播放按键 voidCPlayerDlg: : OnButton5() { intitemCount=m_list.GetCount(); for(inti=0;i if(m_list.GetCheck(i)==BST_CHECKED){ CStringstr; m_list.GetText(m_list.GetCurSel(),str); m_player.SetUrl(str); break; } } } //定时关闭按键 voidCPlayerDlg: : OnButton6() { //TODO: Addyourcontrolnotificationhandlercodehere /*CAboutDlgAd; Ad.p=this; Ad.ShowWindow(SW_NORMAL);*/ StopTime=GetCurrentTime()+60*1000; this->SetTimer(1,1000,NULL);//设置一秒一次的Timer } //列表框 voidCPlayerDlg: : OnDblclkList1() { CStringstr; m_list.GetText(m_list.GetCurSel(),str); m_player.SetUrl(str); //GetDlgItem().SetBkColor(RGB(255,0,0)); } //列表框双击事件: voidCPlayerDlg: : OnDblclkList1() {CStringstr; m_list.GetText(m_list.GetCurSel(),str); m_player.SetUrl(str); } //播放器组件 BOOLCPlayerDlg: : PreTranslateMessage(MSG*pMsg) { //TODO: Addyourspecializedcodehereand/orcallthebaseclass m_tool.RelayEvent(pMsg); returnCDialog: : PreTranslateMessage(pMsg); } 有关菜单的代码: voidCPlayerDlg: : OnMenuitem32771() { //TODO: Addyourcommandhandlercodehere CFileDialogFD(true,"","",OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, "mp3|*.mp3;avi|*.avi;ape|*.ape||"); if(FD.DoModal()==IDOK) { CStringpathname=FD.GetPathName(); pathnames[top]=pathname; m_list.AddString(pathnames[top]); top++; m_list.SetItemHeight(top,20); FILE*fp1=NULL; fp1=fopen("pathnames.txt","w"); for(inti=0;i fprintf(fp1,"%s\t",pathnames[top]); } fclose(fp1); m_player.SetUrl(pathname); } } voidCPlayerDlg: : OnMenuitem32772() { //TODO: Addyourcommandhandlercodehere FILE*fp1=NULL; intitemnum=m_list.GetCount(); fp1=fopen("pathnames.txt","w"); for(inti=0;i fprintf(fp1,"%s\t",pathnames[i]); } fclose(fp1); if(m_hMod){ FreeLibrary(m_hMod); } CDialog: : OnCancel(); } //窗口设置: voidCPlayerDlg: : OnPaint() { if(IsIconic()) { CPaintDCdc(this);//devicecontextforpainting SendMessage(WM_ICONERASEBKGND,(WPARAM)dc.GetSafeHdc(),0); //Centericoninclientrectangle intcxIcon=GetSystemMetrics(SM_CXICON); intcyIcon=GetSystemMetrics(SM_CYICON); CRectrect; GetClientRect(&rect); intx=(rect.Width()-cxIcon+1)/2; inty=(rect.Height()-cyIcon+1)/2; //Drawtheicon dc.DrawIcon(x,y,m_hIcon); } else { CDialog: : OnPaint(); } } //定时器 voidCPlayerDlg: : OnTimer(UINTnIDEvent) { //TODO: Addyourmessagehandlercodehereand/orcalldefault intt=GetCurrentTime();//得到时间,时间到了,结束程序 if(t>this->StopTime)ExitProcess(0); CDialog: : OnTimer(nIDEvent); } 4.2单元测试效果图 本节主要通过运行自制播放器后弹出的窗口以及在窗口上的各种操作来测试软件的功能。 通过各种操作前后效果图的变化来测试软件。 4.2.1MFC组件的使用 初始界面: 初始界面由一个菜单条、一个播放器组件、六个按键、和一个列表框组成。 菜单的使用: 菜单项主要包括三个菜单: 文件、关于、帮助。 文件菜单有三个菜单项: 打开、添加、退出;关于菜单有两个菜单项: 开发时间、开发人员信息;帮助菜单有两个菜单项: 操作说明、帮助文档。 系统播放器组件: 播放按键 双击事件 4.2.2文件的读写操作 文件打开或添加时弹出文件对话框 4.2.3动态数据连接库的使用 删除列表框中的某一歌曲 清空列表 4.2.4多线程的使用 点击定时关闭按键后,播放器会在一定的时间内自动关闭 5总结 自制音乐播放器是运行于VasualC++6.0的一款MFC应用程序,该软件通过运用平时所学的知识,把文件的创建、读写操作,DLL软件开发理念以及多线程的知识系统地联系在了一起。 播放器通过文件的读写知识,实现了对音乐文件的添加、删除等操作;通过动态链接库的知识,将功能函数代码写到dll文件中,而在主界面程序中只是调用这些功能函数,有助于对软件进行更新操作;通过多线程的知识,创建了Timer类,实现定时关闭播放器的操作。 另外,该软件运用了MFC的知识,实现了菜单条、菜单以及菜单项的使用,通过使用事件处理机制,实现了各种按键上的动作事件。 因此,该播放器能够更好地练习本学期所学的各种知识,通过该播放器的开发,回顾了文件的各种操作,加深了对MFC的认识,并且更深刻的理解到使用动态链接库的重要性以及多线程机制的优越性。 致谢 经过两周多的努力,项目即将完成,本学期专业实训的课程也走近尾声。 这段时间是短暂的,但在这段时间里我受益匪浅。 在开发项目的过程中,各种问题接踵而至,如系统播放器的调用、计时器线程的使用以及文件的读写操作等等等;这些问题虽然最终都在马老师的指导和同学的帮助下得到了解决,但不可否认的是我在C语言的理解和应用上还只处于表层阶段,不能深层次的理解C语言的精髓进而熟练应用。 通过此次音乐播放器的编写,我进一步理解了C语言功能的强大性,自己的编程能力、团体意识也得到了大幅的提高,我的知识领域也得到了扩展,专业技能大幅提高,分析和解决实际问题的综合能力也有了很大的发展。 正因为如此,我谨诚挚地向给予我帮助和支持的老师、同学表示深深的谢意。 首先要感谢马飞老师。 马老师学识渊博,治学严谨,一直是我学习的榜样。 一年来,马老师的鼓励和谆谆教导给了我极大的信心,让我在面对困难时应刃而上,不屈不挠。 不断地学习,增加自己的知识储备,让我充实的度过了本学期。 同时,我也要感谢我的同学,他们在我最需要帮助的时候,主动伸出了援助之手,给了我莫大的帮助,让我有信心继续努力下去。 参考文献 C程序设计(第三版)(谭浩强著) C语言程序设计案例教程(沈大林主编张晓蕾杨旭王锦朱立编著) C++语言程序设计(第4版)(郑莉董渊何江舟编著) C语言开发宝典
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MFC 简单 音乐 播放 项目 报告