可换肤MP3播放器详细设计
南京信息工程大学 实验(实习)
实验(实习)名称 详细设计 实验(实习)日期 2011.5.20 得分 指导教师 李振宏
滨江学院 专业 网络工程 年级 大三 班次 二班 姓名 杨武 学号 20102346066
一、实验目的
1(通过对所选题目进行详细设计,掌握算法的设计方法与算法的描述;
2(掌握常用算法描述工具的使用;
3. 完成一个小型软件系统的算法设计。
二、实验准备
1. 熟悉算法描述工具的使用
三、实验要求
完成可换肤MP3播放器的设计与实现的详细设计,提交实验报告。
四、实验内容:
1. 背景
多媒体技术的概念和应用出现于20世纪80年代初期,经过十余年的发展,随着计算机
科学网络的普及和多媒体技术的发展,已成为计算机领域发展的热点技术,针对目前各
种媒体格式,如何简单方便的播放各类媒体已成为人们普遍关注的问题,而媒体播放器
的开发也变得十分重要。本课程设计就是基于面向对象的, 利用vc++6.0开发出适合AVI
的多媒体播放器。该播放器是基于MFC集成开发环境,利用系统的MCI(media controller
interface)命令接口来编程,具有体积小,支持的播放格式多、系统资源占用少、支持
播放列
编辑等功能优势。
2. 程序(模块)系统的组织结构
3. 界面设计要求
图形界面mp3播放器。根据常识来看,打开软件后,会出现图形界面,然后点击图形
界面,选择mp3文件,点击开始,即可播放了。程序编写完毕,编译、运行,用户即可
看到一个美观大方的简单MP3播放器。当程序运行时,Mp3播放起将会实现其播放功
能,它能实现播放WAV、MID、MP3、VCD、AVI、CD、MPEG等全部Windows音频
格式的文件,运行界面。
4(本软件系统中各程序(模块)的设计说明
1、处理“打开”按钮
单击“打开”按钮后,在OnButtonOpen()函数中,首先对文件类型进行过滤,调用DoModa()
函数打开对话框选择一个媒体文件,通过GetPathName()函数获取文件路径,通过
GetFileName()函数获取文件名后,调用DisplayInfo()函数在Static Text控件上显示“你选择
的歌曲是(文件名)”,然后利用GetDlgItem()函数设置“暂停”按钮以及“停止”按钮不可
用。
先点击打开按钮,弹出如下图对话框:
void CActiveMovie3::OnOpen()
{
char szFileFilter[]=
"Mp3 File(*.mp3)|*.mp3|"
"Wma File(*.wma)|*.wma|"
"Video File(*.dat)|*.dat|"
"Wave File(*.wav)|*.wav|"
"AVI File(*.avi)|*.avi|"
"Movie File(*.mov)|*.mov|"www.findart.com.cn
"Media File(*.mmm)|*.mmm|"
"Mid File(*.mid;*,rmi)|*.mid;*.rmi|"
"MPEG File(*.mpeg)|*.mpeg|"
"All File(*.*)|*.*||";//文件类型过滤
CFileDialogdlg(TRUE,NULL,NULL,OFN_HIDEREADONLY,szFileFilter);
if(dlg.DoModal()==IDOK){
CString PathName=dlg.GetPathName();
PathName.MakeUpper();
m_ActiveMovie.SetFileName(PathName);
}
}
打开文件以及对文件的处理之类的函数控制
#if !defined(AFX_PLAYERDLG_H__FE3B843D_BE0F_46C6_9038_4AA6AA8032A8__INCLUDED_)
#define
AFX_PLAYERDLG_H__FE3B843D_BE0F_46C6_9038_4AA6AA8032A8__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
/////////////////////////////////////////////////////////////////////////////
// CPlayerDlg dialog
#include"mmsystem.h"
class CPlayerDlg : public CDialog
{
// Construction
public:
int hour,minute,second;//时间变量:小时、分钟、秒钟
DWORD cdlen;//某个音频文件的总时间长度
DWORD m_count;//设备型号
void Tplay();
Void Thide();
void Tdehide();
void forfor();
void forfor1();
DWORD getinfo(DWORD item);
CString aa;//当前播放文件的路径
CString file[255];//存放所有待播放文件路径名的字符串数组
CString file1[255];//存放所有待播放文件路径名的字符串数组1
int fi,fr;//歌曲文件列表中,当前歌曲所在位置及最后一首歌曲所在的位置
DWORD cdfrom,cdto; //歌曲的起点和终点
CBitmapButton m_bexit;
CBitmapButton m_bmim;
CBitmapButton m_bhelp;
CBitmapButton m_play;
CBitmapButton m_stop;
CBitmapButton m_open;
CBitmapButton m_rp;
CBitmapButton m_pop;
CBitmapButton m_next;
CBitmapButton m_sdel;
CBitmapButton m_per;
CBitmap m_bg,m_bg1;
BOOL m_flag,m_flag1,m_flag2,m_flag3;//各个控件的状态标志
CPlayerDlg(CWnd* pParent = NULL); // standard constructor
对播放器的整体结构进行模块的总体设计
// CAboutDlg dialog used for App About
//进行程序主界面的初始化,并向控件中添加Bitmap图
BOOL CPlayerDlg::OnInitDialog()
{ .....
SetWindowText("MCI播放器");
//程序主界面在屏幕中的位置,及主界面的大小
MoveWindow(200,200,303,103);
//加载程序背景图片
m_bg.LoadBitmap(IDB_BITMAPBG);
//以下部分是在控件上加载图片
m_play.LoadBitmaps(IDB_BITMAPPLAY1,IDB_BITMAPPLAY3);
m_stop.LoadBitmaps(IDB_BITMAPSTOP1,IDB_BITMAPSTOP3);
m_open.LoadBitmaps(IDB_BITMAPOPEN1,IDB_BITMAPOPEN3);
m_bhelp.LoadBitmaps(IDB_BITMAPHELP1,IDB_BITMAPHELP2);
m_bmim.LoadBitmaps(IDB_BITMAPMIM1,IDB_BITMAPMIM2);
m_bexit.LoadBitmaps(IDB_BITMAPEXIT1,IDB_BITMAPEXIT2);
m_rp.LoadBitmaps(IDB_BITMAPRP1,IDB_BITMAPRP2);
m_pop.LoadBitmaps(IDB_BITMAPC,IDB_BITMAPD);
m_pop.LoadBitmaps(IDB_BITMAPA,IDB_BITMAPB);
m_per.LoadBitmaps(IDB_BITMAPPER1,IDB_BITMAPPER2);
m_next.LoadBitmaps(IDB_BITMAPNEXT1,IDB_BITMAPNEXT2);
m_sdel.LoadBitmaps(IDB_BITMAPDEL1,IDB_BITMAPDEL2);
......
}
//在程序的主界面上显示控件
void CPlayerDlg::OnPaint()
{
if (IsIconic())// 判断是否为程序的主界面
{ //以下部分有Visual C++自动生成
CPaintDC dc(this);
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
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;
dc.DrawIcon(x, y, m_hIcon);
}
else
{ //画笔工作区
CPaintDC dc(this);
CRect rect;
GetClientRect(&rect);
CDC dcMem;
dcMem.CreateCompatibleDC(&dc);
BITMAP bitMap;
m_bg.GetBitmap(&bitMap);
CBitmap *pbmpOld=dcMem.SelectObject(&m_bg);
dc.StretchBlt(0,0,502,rect.Height(),&dcMem,0,0,bitMap.bmWidth,
bitMap.bmHeight,SRCCOPY);//利用位图填充应用程序的界面
//添加控件,设定主界面上控件的位置和大小
m_bexit.MoveWindow(284,0,19,19,false);
m_bmim.MoveWindow(263,0,19,19,false);
m_bhelp.MoveWindow(242,0,19,19,false);
m_play.MoveWindow(13,60,40,40,false);
m_stop.MoveWindow(55,68,30,30,false);
m_open.MoveWindow(93,65,30,30,false);
m_rp.MoveWindow(133,68,30,30,false);
m_pop.MoveWindow(282,22,20,78,false);
m_per.MoveWindow(170,60,40,40,false);
m_next.MoveWindow(200,60,40,40,false);
m_sdel.MoveWindow(484,30,18,40,false);
}
}
CPlayerDlg::CPlayerDlg(CWnd* pParent /*=NULL*/)
: CDialog(CPlayerDlg::IDD, pParent)
{
(10) 实现弹出关于对话框的功能
void CActiveMovie3::About()
{
CAboutDlg aboutDlg; //定义变量
aboutDlg.DoModal(); //弹出关于对话框
}
2 处理“播放”按钮
单击“播放”按钮后,在OnButtonPlay()函数中,通过调用MCIMP3类的MCIOpen()函数获
取刚才选择的文件路径以及文件名,调用该类的MCIPlay()函数播放歌曲,此时调用
DisplayInfo()函数在Static Text控件上显示“正在播放的歌曲是(文件名)”,进行歌曲的播
放,然后利用GetDlgItem()函数设置“播放”按钮不可用。
为了循环播放,我们利用定时器来工作,采用OnTimer()函数来激活定时器:
void CActiveMovie3::OnTimer(UINT nIDEvent)
{
CString m_filename; //定义文件变量
double CurPos=m_ActiveMovie.GetCurrentPosition(); //获得播放位置
if(CurPos= = 0)
{
m_list.SetCurSel(0); //选择列表框的第一个文件
m_list.GetText(0,m_filename);
m_ActiveMovie.SetAutoStart(1); //设置自动播放
m_ActiveMovie.SetFileName(m_filename); //设置文件
m_ActiveMovie.Run(); //播放
m_list.GetCurSel(); //获得播放文件
m_list.InsertString(-1,m_filename); //插入列表框最后
m_list.DeleteString(0); //删除用过的文件
}
CDialog::OnTimer(nIDEvent);
}
(3)循环控制函数
oid CMediaPlayerDlg::OnRepeat() //循环控制函数,实现对循环的控制功能
{
if(!isRepeat){ //判断是否正在循环
SetTimer(1,2000,NULL); //设置循环的标志为1,循环间隔为2秒
isRepeat=TRUE; //将循环变量设为TURE
SetDlgItemText(IDC_STATIC2,"模式:循环"); //将静态文本显示为循环模式
}
else{
KillTimer(1); //停止标志为1的循环
isRepeat=FALSE; //将循环变量设为FALSE
SetDlgItemText(IDC_STATIC2,"模式:普通"); //将静态文本显示为普通模式
}
}
(4)全屏播放功能调用了m_ActiveMovie.SetMovieWindowSize函数,代码如下:
void CActiveMovie3::OnFulscreeen() //全屏函数,实现全屏播放视频的功能
{
m_ActiveMovie.Pause(); //暂停播放
m_ActiveMovie.SetFullScreenMode(true); //设置全屏播放属性为真,即开启全屏播放
m_ActiveMovie.SetMovieWindowSize(SW_SHOWMAXIMIZED); //设置播放窗口大
小为最大
m_ActiveMovie.Run(); //继续播放
}
(5)查询歌曲代码如下:
void CActiveMovie3::OnChaxun()
{
CSongSet cSet;
UpdateData();
m_Edit1.TrimLeft();
if(m_Edit1.IsEmpty())
{
MessageBox("要查询的歌曲不能为空!");
return;
}
CSongDlg dlg;
cSet.m_strFilter.Format("歌曲名称='%s'",m_Edit1);
cSet.Open();
if(!cSet.IsEOF())//如果打开的
集有记录
{
CSongDlg dlg;
dlg.m_Gequ =cSet.m_GeQu;
dlg.m_Geshou =cSet.m_GeShou;
dlg.m_Zuoci =cSet.m_ZuoCi;
dlg.m_Zuoqu =cSet.m_ZuoQu;
dlg.m_Zhuanji =cSet.m_ZhuanJi;
dlg.DoModal();
UpdateData(FALSE);//自动更新表单中控件显示的内容
}
else
MessageBox("没有查到你要找的歌曲记录!");
if(cSet.IsOpen())cSet.Close();
}
void CActiveMovie3::OnTianjia()
{
// TODO: Add your control notification handler code here
CSongDlg dlg;
CSongSet pSet;
if(dlg.DoModal()==IDOK)
{
pSet.Open();
pSet.AddNew();
pSet.m_GeQu =dlg.m_Gequ;
pSet.m_GeShou =dlg.m_Geshou;
pSet.m_ZhuanJi =dlg.m_Zhuanji;
pSet.m_ZuoCi =dlg.m_Zuoci;
pSet.m_ZuoQu =dlg.m_Zuoqu;
pSet.Update();
pSet.Requery();
}
}
(6)循环控制函数
void CActiveMovie3::OnRepeat() //循环控制函数,实现对循环的控制功能
{
if(!isRepeat){ //判断是否正在循环
SetTimer(1,2000,NULL); //设置循环的标志为1,循环间隔为2秒
isRepeat=TRUE; //将循环变量设为TURE
SetDlgItemText(IDC_STATIC2,"模式:循环"); //将静态文本显示为循环模式
}
else{
KillTimer(1); //停止标志为1的循环
isRepeat=FALSE; //将循环变量设为FALSE
SetDlgItemText(IDC_STATIC2,"模式:普通"); //将静态文本显示为普通模式
}
}
3 处理“暂停”按钮
单击“暂停”按钮后,在OnButtonPause()函数中,首先通过调用MCIMP3类的MCIPause()
函数暂停正在播放的歌曲,然后调用DisplayInfo()函数在Static Text控件上显示“暂停播
放歌曲(文件名)”,此时的歌曲处于暂停时的进度上,利用GetDlgItem()函数设置“播
放”按钮可用。
增加按钮 “播放”
void CActiveMovie3::OnPlay()
{
m_ActiveMovie.Run();//播放文件
SetTimer(0,20,NULL);//设置定时器
}
void CActiveMovie3::OnStop()
{
m_ActiveMovie.Stop();//停止播放文件
KillTimer(0);//关掉定时器
}
4 处理“停止”按钮
单击“停止”按钮后,在OnButtonStop()函数中,首先通过调用MCIMP3类的MCIPause()
函数停止正在播放的歌曲,然后调用DisplayInfo()函数在Static Text控件上显示“停止
播放歌曲(文件名)”,将停止正在播放歌曲,利用GetDlgItem()函数设置“暂停”按钮
和“停止”按钮不可用。
停止播放.暂停播放
void CActiveMovie3::OnStop() //停止播放函数
{
KillTimer(1); //停止循环
m_ActiveMovie.Stop(); //停止播放
}
void CActiveMovie3::OnPause() //暂停播放函数
{
m_ActiveMovie.Pause(); //调用控件的暂停函数暂停播放}
5 处理“退出”按钮
单击“退出”按钮后,在OnButtonQuit()函数中,调用CDialog类的OnCancel()函数将退出
对话框,结束程序的运行。
5、模块相互关系表
<播放器列表管理窗口><播放主操作盘>
列表管理操作接口播放控制操作接口
列表管理模块核心播放控制模块
数据库
MP3文件
6.试验最终的效果图
在播放过程中,可以通过“暂停”、“停止”、“+”(增大音量)、“-”(降低音量)、
“×”(静音)等按钮达到相应的播放控制功能。此时,还可以再次单击“打开”按钮
继续向播放列表中添加媒体文件,程序会按列表中的顺序自动循环播放文件。分别对
mp3、wma、wmv、等不同音频、视频格式的文件进行测试播放,经测试均可以成功运
行。
五、试验
本次课程设计中虽然可以实现播放、暂停、停止以及音量等功能,但仍然存在着放多不足,
比如列表管理的功能以及循环播放功能始终无法实现,如果有时间一定会好好研究。课设是
辛苦劳累的,但是收获同样是巨大的,在课设中每解决一个问题,那种成就感是无法言语的,
课设中第一次调试程序时出现了逻辑错误,编译能通过,运行始终无法通过,后来经过思考,
进行了多次修改调试之后得到了运行结果,虽然以前在程序中未曾见到过,但是经过改正调
试最终达到了目的。虽然设计的过程比较辛苦,但是总算来说试验是能够正常的完成了,所
以还是比较开心的,希望以后自己再接再厉。