资源描述
xx大学
课 程 设 计 说 明 书
学生姓名: xx 学 号: 37
学 院: 信息与通信工程学院
专 业: 信息工程
题 目: mp3播放器
xx
指导教师: 职称: 副教授
年 月 日
下达任务书日期: 2016 年 5 月 27 日
课 程 设 计 任 务 书
1.设计目的:
通过设计,明确音频机的设计思想和设计过程,扎实掌握VC、C++或C语言编程的整体框架和步骤,使学生具有一定综合分析问题和解决问题的能力。
2.设计内容和要求(包括原始数据、技术参数、条件、设计要求等):
功能说明:
具有播放MP3音乐的功能。
设计要求:
课程设计的目的在于培养学生的综合素质,要求学生做到:
(1)根据题目要求查阅有关资料,确定方案,写出设计方案;
(2)根据对选题的理解,消化查阅资料,给出相关设计的流程图;
(3) 在C语言、C++或VC环境下,实现各项功能;
(4) 对结果进行分析总结。
3.设计工作任务及工作量的要求〔包括课程设计计算说明书(论文)、图纸、实物样品等〕:
设计工作任务:
(1) 了解课题背景,掌握基本技术,制定程序设计框架。
(2) 完成设计内容:包括程序流程图和完成实现功能的程序代码,写出设计说明书。
(3) 设计答辩。
工作量的要求:
(1) 通过查阅资料了解与音频播放程序设计相关的基本理论、原理以及背景知识,理解选题意义;
(2) 掌握与音频播放程序相关的设计思想、原理、设计框架和步骤;
(3) 完成音频播放程序的功能和程序代码的实现;
(4) 通过实验验证程序代码的可行性;
(5) 给出设计总结。
课 程 设 计 任 务 书
4.主要参考文献:
Visual C++课程设计案例精编(第二版)
5.设计成果形式及要求:
程序运行结果;
课程设计说明书。
6.工作计划及进度:
2016年5月30日 ~ 2016年6月1日:查资料
2016年6月2日 ~ 2016年6月7日:在指导教师指导下设计方案及程序
2016年6月8日 ~ 2016年6月15日:学生上机调试程序,指导教师辅导
2016年6月16日~ 2016年6月18日:完成课程设计说明书
2016年6月19日:答辩
系主任审查意见:
签字:
年 月 日
目录
1.摘要---------------------------------------------------1
1.1)设计内容--------------------------------------------1
1.2)MCI简介--------------------------------------------1
1.2-①任务-----------------------------------------------2
1.2-②各模块功能设计-------------------------------------3
1.2-③操作步骤------------------------------------------4
1.2-④函数代码------------------------------------------5
2.课程设计分析与结果------------------------------------13
3.总结--------------------------------------------------14
参考文献------------------------------------------------14
18
1. 摘要
利用MFC应用程序、媒体控制接口MIC的基本知识,设计一个MP3播放器。要求能够播放常用Windows音频格式的文件;实现播放控制:播放、暂停、停止等;实现音量控制:静音、声音放大减小;实现播放列表管理:加入文件、加入目录、删除文件等功能
关键词:MP3播放器的设计
设计目的 利用VC++开发一个支持wav、mp3、wma等不同音频格式的媒体播放器。通过课程设计掌握多媒体编程的基本原理。
1) 设计内容
MP3播放器的设计是利用MFC应用程序、媒体控制接口MIC 的基本知识而设计的。(MFC 简介) MFC是Visual C++是核心。MFC类库将所有图形用户界面的元素如窗口、菜单和按钮等都以类的形式进行了封装,MFC AppWizard向导根据继承性利用MFC派生出自己的类,并对Windows应用程序进行了分解,利用MFC派生类对应用程序重新进行组装,同时还规定了应用程序中各个MFC派生类对象之间的相互联系,实现了标准Windows应用程序的功能,这就是向导生成的所谓MFC应用程序框架。每个MFC类都包括了一些函数,函数放到类中,符合C++编程方法。这些函数,必须通过类定义对象才能使用
2) MCI简介
MCI(Media Control Interface)媒体控制接口是MircroSoft提供的一组多媒体设备和文件的标准接口,它的好处是可以方便地控制绝大多数多媒体设备包括音频、视频、影碟、录像等多媒体设备,而不需要知道它们的内部工作状况。它所支持的媒体格式包括mp3、avi、wav、mpeg等等[2]。 音频技术发展较早,几年前一些技术已经成熟并产品化,音频技术主要包括四个方面:音频数字化、语音处理、语音合成及语音识别。 音频文件包括多种格式的文件,MP3就是其中的一种。MP3的全称是Moving Picture Experts Group,Audio Layer Ⅲ,它所使用的技术是在VCD(MPEG-1)的音频压缩技术上发展出的第三代,而不是MPEG-3。MP3是一种音频压缩的国际技术标准,它一般需要MP3播放器来读取
① 任务:
1) 编程实现一个可支持多种音频格式的媒体播放器,其基本功能包括媒体播放、音量调节、播放进度选择、暂停、停止以及歌曲信息的查询与添加等;
2) 给出程序的总体设计和详细设计,要求程序总体架构
3)图详细设计的流程图说明等
表一
② 各模块功能设计
2.1 处理“打开”按钮
单击“打开”按钮后,在onfilechoice()函数中,首先对文件类型进行过滤,调用GetSystemMene()函数打开对话框选择一个媒体文件,通过GetPathName()函数获取文件路径,通过onfilechoice()函数获取文件名后,调用DisplayInfo()函数在Static Text控件上显示“你选择的歌曲是(文件名)”,然后利用pause()函数设置“暂停”按钮以及“停止”按钮不可用。
2.2 处理“播放”按钮
单击“播放”按钮后,在onplay()函数中,通过调用CMP3Dlg类的GetPathName函数获取刚才选择的文件路径以及文件名,调用该类的void play()函数播放歌曲,此时调用GetDlgItemText(IDC_pause,strtemp)获取按钮状态,然后利用SetDlgItemText()函数设置“播放”按钮不可用。
2.3 处理“暂停”按钮
单击“暂停”按钮后,在Onstop ()函数中,首先通过调用CMP3Dlg类的pause()函数暂停正在播放的歌曲,GetDlgItem(IDC_play)->EnableWindow(false),当暂停按钮按下时,通过GetDlgItemText(IDC_pause,strtemp)获取按钮状态,此时歌曲处于暂停的进度条上,利用GetDlgItem(IDC_stop)->EnableWindow(true)函数设置“播放”按钮可用。
2.4 处理“停止”按钮
单击“停止”按钮后,首先通过调用CMP3Dlg类的stop()函数暂停正在播放的歌曲,GetDlgItem(IDC_play)->EnableWindow(false)当stop按钮按下时,播放和暂停应该均不可用,此时的歌曲处于暂停时的进度上,利用GetDlgItem(IDC_stop)->EnableWindow(true)函数设置“播放”按钮可用。 ,
10 将停止正在播放歌曲,利用GetDlgItem()函数设置“暂停”按钮和“停止”按钮不可用。
2.5 处理“音量”滑块
拉动“音量”滑块后,在m_slider.SetRange(0,1000)中,设置滑块的移动范围为0~1000。在启动程序时,通过m_slider.SetPos(500)函数设置滑块指针的初始位置设为500且代表初始音量为50 。
2.6 处理“退出”按钮 单击“退出”按钮后,在Onexitbt()函数中,调用CDialog类的OnCancel()函数将退出对话框,结束程序的运行
③ 操作步骤
1) 先在VS环境下建立好一个基于对话框的工程。
2) 打开资源视图,在对话框内按照布局图布局,步好后根据 表-1来设置属性。添加相应的变量和函数。
3) 进行程序初始化。
4) 为各个按钮添加消息处理函数,并添加相应的代码。
5) 全部完成后进行测试和调试。
④ 函数代码
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMP3Dlg dialog
CMP3Dlg::CMP3Dlg(CWnd* pParent /*=NULL*/)
: CDialog(CMP3Dlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CMP3Dlg)
m_int = 0;
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDI_ICON1);
}
void CMP3Dlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CMP3Dlg)
DDX_Control(pDX, IDC_SLIDER, m_slider);
DDX_Text(pDX, IDC_vol, m_int);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CMP3Dlg, CDialog)
//{{AFX_MSG_MAP(CMP3Dlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_about, Onabout)
ON_BN_CLICKED(IDC_exitbt, Onexitbt)
ON_NOTIFY(NM_CUSTOMDRAW, IDC_SLIDER, OnCustomdrawSlider)
ON_BN_CLICKED(IDC_filechoice, Onfilechoice)
ON_BN_CLICKED(IDC_play, Onplay)
ON_BN_CLICKED(IDC_pause, Onpause)
ON_BN_CLICKED(IDC_stop, Onstop)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMP3Dlg message handlers
BOOL CMP3Dlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
m_slider.SetRange(0,1000);//滑块的移动范围0~1000
m_slider.SetPos(500);//滑块指针的初始位置设为500代表初始音量为50
GetDlgItem(IDC_play)->EnableWindow(false);//文件没有读取时所有按钮应该是不可选的
GetDlgItem(IDC_pause)->EnableWindow(false);
GetDlgItem(IDC_stop)->EnableWindow(false);
// TODO: Add extra initialization here
return TRUE; // return TRUE unless you set the focus to a control
}
void CMP3Dlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the documentiew model,
// this is automatically done for you by the framework.
void CMP3Dlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CMP3Dlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CMP3Dlg::Onabout()
{
// TODO: Add your control notification handler code here
CAboutDlg dlg;
dlg.DoModal();
}
void CMP3Dlg::Onexitbt()
{
// TODO: Add your control notification handler code here
CDialog::OnCancel();
}
void CMP3Dlg::OnCustomdrawSlider(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
UpdateData(true);
m_int=m_slider.GetPos()/10;
setvolume(m_slider.GetPos());
UpdateData(false);
*pResult = 0;
}
void CMP3Dlg::Onfilechoice()
{
// TODO: Add your control notification handler code here
char szFileFilter[]="mp3文件(*.mp3)|*.mp3|"
"wma文件(*.wma)|*.wma|"
"wav文件(*.wav)|*.wav|"
"所有文件(*.*)|*.*|";
CFileDialog dlg(true,NULL,NULL,OFN_HIDEREADONLY,szFileFilter);
if(dlg.DoModal()==IDOK)
{
CString strFilepath=dlg.GetPathName();
CString strFilename=dlg.GetFileName();
SetDlgItemText(IDC_filename,strFilename);
Load(this->m_hWnd,strFilepath);
GetDlgItem(IDC_play)->EnableWindow(true);//文件读取成功时所有按钮变可选的
GetDlgItem(IDC_pause)->EnableWindow(true);
GetDlgItem(IDC_stop)->EnableWindow(true);
}
}
void CMP3Dlg::Onplay()
{
// TODO: Add your control notification handler code here
play();
SetDlgItemText(IDC_pause,"暂停");
}
void CMP3Dlg::Onpause()
{
// TODO: Add your control notification handler code here
CString strtemp;
GetDlgItemText(IDC_pause,strtemp);//获取按钮状态
if(strtemp.Compare("暂停")==0)
{
pause();
SetDlgItemText(IDC_pause,"恢复");
}
if(strtemp.Compare("恢复")==0)
{
resume();
SetDlgItemText(IDC_pause,"暂停");
}
}
void CMP3Dlg::Onstop()
{
// TODO: Add your control notification handler code here
stop();
SetDlgItemText(IDC_pause,"暂停");
GetDlgItem(IDC_play)->EnableWindow(false);//当stop按钮按下时,播放和暂停应该均不可用
GetDlgItem(IDC_pause)->EnableWindow(false);
}
/ MP3音乐播放器.cpp : Defines the class behaviors for the application.
//
#include "stdafx.h"
#include "MP3音乐播放器.h"
#include "MP3音乐播放器Dlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CMP3App
BEGIN_MESSAGE_MAP(CMP3App, CWinApp)
//{{AFX_MSG_MAP(CMP3App)
// NOTE - the ClassWizard will add and remove mapping macros here.
// DO NOT EDIT what you see in these blocks of generated code!
//}}AFX_MSG
ON_COMMAND(ID_HELP, CWinApp::OnHelp)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMP3App construction
CMP3App::CMP3App()
{
// TODO: add construction code here,
// Place all significant initialization in InitInstance
}
/////////////////////////////////////////////////////////////////////////////
// The one and only CMP3App object
CMP3App theApp;
/////////////////////////////////////////////////////////////////////////////
// CMP3App initialization
BOOL CMP3App::InitInstance()
{
AfxEnableControlContainer();
// Standard initialization
// If you are not using these features and wish to reduce the size
// of your final executable, you should remove from the following
// the specific initialization routines you do not need.
#ifdef _AFXDLL
Enable3dControls(); // Call this when using MFC in a shared DLL
#else
Enable3dControlsStatic(); // Call this when linking to MFC statically
#endif
CMP3Dlg dlg;
m_pMainWnd = &dlg;
int nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
// TODO: Place code here to handle when the dialog is
// dismissed with OK
}
else if (nResponse == IDCANCEL)
{
// TODO: Place code here to handle when the dialog is
// dismissed with Cancel
}
// Since the dialog has been closed, return FALSE so that we exit the
// application, rather than start the application's message pump.
return FALSE;
}
2. 课程设计分析与结果
按照课程设计的要求,我们用C/C++来实现功能,但由于我们 在学过面向对象后,我们常用的是Visual Studio 2010版本的VS编辑器。在分析所要做的播放器时,想到的最基本的功能就是可以播放音乐,其次就是对播放过程中的操作,如:快进或快退、上一曲或下一曲、播放/暂停、音量大小、选择和添加歌曲、播放界面选择……等等功能。但是,由于学识有限,我们在这一周的时间内没有去考虑这么多功能,所以对于这样一个播放器,还是存在很多的改进方案。那么只有在以后的探索中慢慢来实现了。
3. 总结
经过三周的面向对象程序课程设计,我们小组学到了很多。在这三周的实际动手学习中,我们对VC++这门课程有了更深刻的认识,掌握了用MFC创建基于对话框的应用程序,同时了解了MCI相关知识。这次课程设计我做了MP3播放器的设计,MP3播放器主要对常用Windows音频格式的文件实现播放控制:播放歌曲、暂停播放、停止播放等;实现音量控制:静音、声音放大以及声音减小的功能。 本次课程设计中虽然可以实现播放、暂停、停止、播放界面美化以及音量等功能,但仍然存在着放多不足,比如进度条功能没有实现。
列表管理的功能以及循环播放功能始终无法实现,如果有时间一定会好好研究。 课设是辛苦劳累的,但是收获同样是巨大的,在课设中每解决一个问题,那种成就感是无法言语的,课设中第一次调试程序时出现了很多错误,其中有逻辑错误,编译能通过,运行始终无法通过,后来经过思考,进行了多次修改调试之后得到了运行结果;但是还是存在兼容性问题,电脑版本和系统以及软件的版本之间存在各种兼容性问题,因为之前在程序中几乎没见到过,所以一时不知从何处检查并改进,后来在老师和学长的帮助下,找到了问题,结果换了台电脑,经过改正调试最终达到了目的。像此类的问题还有很多,不过经过查询资料,咨询老师,与同学探讨最终得到了理想的程序。此外,我们还得到了一个结论,在课程设计中,老师的作用有时是不可或缺的,可以在关键时刻给我们一些重要的提示,从而方便我们解决各种问题。这就是我们小组对这次软件课程设计的总结。
参考文献
【1】《C 语言程序设计教程》 第三版 谭浩强 高等教育出版社
【2】《VC++数字图像处理》 何斌 人民邮电出版社目 录
第一章 概 论 1
1.1项目名称 1
1.2项目地点 1
1.3区域特点 1
1.4建设规模 1
1.5可行性研究范围 2
1.6项目估算总投资额 3
第二章 项目市场分析 3
2.1####县经济发展趋势分析 3
2.2####县房地产发展概况 4
2.3区域市场分析 10
2.4项目利弊分析 11
第三章 项目定位及销售预测 12
3.1项目定位 12
3.2销售情况预测 14
3.3销售价格预测 14
第四章 项目的工程技术方案 15
4.1总平面及建筑方案 15
4.2结构 16
4.3供配电工程 16
4.4给排水工程 16
4.5人防 17
4.6弱电工程 17
4.7主要设备设施 17
4.8交通与停车 17
4.9环境保护 17
第五章 项目管理与建设进度计划 19
5.1项目运作模式 19
5.2招投标管理 19
5.3工程监理 19
5.4物业管理 19
5.5建设进度计划 19
5.6销售计划 20
第六章 项目营销和招商方案 21
6.1销售、租赁比例 21
6.2运营策略 21
6.3招商策略 22
第七章 投资估算和资金筹措 25
7.1投资估算 25
7.2资金筹措 27
7.3资金平衡计划:见下表 28
第八章 效益分析 29
8.1销售收入、销售税金及附加估算 29
8.2经营成本及费用估算 30
第九章 项目风险及防范措施 31
9.1市场风险 31
9.2筹资风险 31
9.3销售不确定性风险 31
9.4项目开发的风险 32
9.5成本控制的风险 32
第十章 结论及建议 33
10.1结论 33
10.2建议 33
展开阅读全文