学 号:
课 程 设 计
2013——2014学年 第2学期
课程名称
可视化编程(VC) 学 院 计算机科学与技术学院
专 业
软件工程
班
级 姓 名 指导教师
岑 丽
目录
1 课程设计要求 (1)
2 系统的简单操作及功能说明 (1)
2.1 系统简单操作 (1)
2.2 功能说明 (2)
3 所设计系统实现的各模块介绍 (3)
3.1 流程图设计 (3)
3.2 各模块介绍 (3)
4 各模块源程序及对源程序主要部分的相应注释说明 (4)
4.1 播放控制 (4)
4.2 播放模式 (5)
4.3 播放列表 (8)
4.4 播放界面 (9)
5 运行结果界面截图 (12)
5.1 初始界面 (12)
5.2 添加文件 (13)
5.3 播放音频 (13)
5.3 播放视频 (14)
6 程序设计问题与总结 (15)
6.1 设计中遇到的问题及相应的解决方法和解决过程 (15)
6.2 个人总结 (17)
参考文献 (18)
1 课程设计要求
学生姓名:______ 专业班级:
指导教师:岑丽工作单位:计算机科学与技术学院
题目: 基于MFC的多媒体播放器系统实现
1.制作一个具有自己设计风格的媒体播放器。
2.要求能随机选取要播放的文件,实现前进,回退,暂停,循环播放,
音量大小调节等基本功能。
3.要求能播放多种格式(至少四种或四种以上)的音频视频格式文件。
4.可以实现其它附加功能(不在要求范围之内)
5.界面良好,功能完善
2 系统的简单操作及功能说明
2.1 系统简单操作
1.播放文件按钮
当用户想要打开某个播放文件时,只要选中播放列表中的需要播放的文件,再单击播放文件按钮,该文件就会进行播放。再次单击播放文件按钮,则播放暂停;
2.添加文件按钮
当用户想添加播放文件到播放列表时,可以单击添加文件按钮,选定需要播放的文件的路径并打开,则选定的文件将被添加到播放列表中;
3.列表/单一循环按钮
当用户单击列表/单一循环按钮时,播放模式会切换到会转变到相应的模式下;
4.上一首/下一首按钮
当用户单击该按钮时,播放的文件相应变化;
5.播放进度滑块
滑块当文件正在进行播放时,用户可以通过滑动播放进度滑块进行对播放进程的控制,实现音频视频文件播放的快进和快退;
6.音量调节滑块
用户可以通过对音量调节滑块进行调节从而控制音量的大小;
7.停止播放按钮
单击该按钮,停止播放;
8.退出程序按钮
当用户对播放器操作完成后可以通过单击退出程序按钮从播放器中退出,退出程序后播放列表将自动清空。
2.2 功能说明
本次的课程设计是利用MFC类库,结合ActiveX控件资源开发一款简单而实用的多媒体播放软件Multimedia player播放器。
Multimedia player播放器主要对常用音频及视频格式的文件实现以下功能:1.能随机选取要播放的音频或视频文件
2.播放控制:播放/暂停、停止、退出,列表循环、单一循环等;
3.显示播放进度及播放菜单;
4.音量大小调节;
5.播放多种格式(*.mp3,*.wma,*.wav,*.avi,*.mov)的音频视频文件;
6.控制播放进度和播放模式。
3 所设计系统实现的各模块介绍
3.1 流程图设计
3.2 各模块介绍
本多媒体播放系统从界面上看分为四个部分:播放控制、播放模式、播放列表,播放界面。
1.播放控制:主要包括媒体文件的播放、暂停、停止和程序的退出;
2.播放模式:包括列表循环、单一播放、上下选择三种模式。用户通过对这三种模式的选择来控制音频视频的播放顺序;
3.播放列表:播放列表记录了被用户添加的需要播放的文件,方便用户在添加文件之后可以迅速找到需要播放的文件;
4.播放界面:音频的频谱和视频都会显示在播放界面上,播放界面还可以方便用户调整播放进度、音量大小,也能对音频和视频进行播放和暂停的控制。
4 各模块源程序及对源程序主要部分的相应注释说明4.1 播放控制
1.播放/暂停媒体文件
void CMy2Dlg::OnPause()
{
// TODO: Add your control notification handler code here
//static bool i=true;
if(i)
{
i=false;
m_wj.GetControls().pause();
m_pause.SetWindowText("播放");
KillTimer(TIMER1);
}
else
{
i=true;
m_wj.GetControls().play();
m_pause.SetWindowText("暂停");
SetTimer(TIMER1,100,0);
}
}
2.停止播放
当文件还未播完时,单击停止按钮时,调用文件停止函数Onstop(),系统回到初始状态。具体如下:
void CMy2Dlg::OnStop()
{
// TODO: Add your control notification handler code here
KillTimer(TIMER1);
m_wj.GetControls().stop();
m_pause.SetWindowText("播放");
i=false;
}
3.退出系统
void CMy2Dlg::OnClose()
{
// TODO: Add your control notification handler code here
KillTimer(TIMER1);
DestroyWindow();
}
4.2 播放模式
1.循环播放功能
在函数OnState() 中输入以下代码。
void CMy2Dlg::OnState()
{
// TODO: Add your control notification handler code here
if(s)
{
m_state.SetWindowText("单一循环");
s=false;
}
{
m_state.SetWindowText("列表循环");
s=true;
}
}
2.选择上/下一个文件
void CMy2Dlg::OnReverse()
{
// TODO: Add your control notification handler code here
if(k)
{
POSITION pos = m_list.GetFirstSelectedItemPosition();
Item = m_list.GetNextSelectedItem(pos);
}
m_list1.InsertItem(0,fileName[Item-1]);
m_list.SetItemText(0,1,NULL);
if(Item!=0)
{
pathName[Item-1].MakeUpper();
m_wj.SetUrl(pathName[Item-1]);
m_wj.GetControls().play();
}
if(Item==0)
{
pathName[Item].MakeUpper();
m_wj.SetUrl(pathName[Item]);
m_wj.GetControls().play();
k=false;
if(Item>0)
Item--;
if(Item==0)
{
m_list1.InsertItem(0,fileName[0]);
m_list.SetItemText(0,1,NULL);
}
}
void CMy2Dlg::OnForward()
{
// TODO: Add your control notification handler code here
if(k)
{
POSITION pos = m_list.GetFirstSelectedItemPosition();
Item = m_list.GetNextSelectedItem(pos);
}
m_list1.InsertItem(0,fileName[Item+1]);
m_list.SetItemText(0,1,NULL);
pathName[Item+1].MakeUpper();
m_wj.SetUrl(pathName[Item+1]);
m_wj.GetControls().play();
k=false;
if(Item Item++; if(Item==j-1) { m_list1.InsertItem(0,fileName[Item]); m_list.SetItemText(0,1,NULL); } } 4.3 播放列表 添加文件到列表 void CMy2Dlg::OnOpen() //添加文件到列表 { // TODO: Add your control notification handler code here m_slider.SetPos(0); char szFileFilter[]= "Available File (*.*)|*.*||"//五种音频视频格式类型 "Mp3 File(*.mp3)|*.mp3|"//音频 "Wma File(*.wma)|*.wma|"//音频 "Wave File(*.wav)|*.wav|"//音频 "A VI File(*.avi)|*.avi|"//视频 "Movie File(*.mov)|*.mov|";//视频 //可以播放mp3、wma、avi、wav、mov格式的文件 CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY,szFileFilter); if(dlg.DoModal()==IDOK) { CString PathName=dlg.GetPathName(); pathName[j]=dlg.GetPathName(); fileName[j]=dlg.GetFileName(); PathName.MakeUpper(); m_wj.SetUrl(PathName); int nItem=m_list.InsertItem(j,dlg.GetFileName()); m_list.SetItemText(nItem,1,NULL); m_list1.InsertItem(0,dlg.GetFileName()); m_list.SetItemText(0,1,NULL); j++; Item++; } } 4.4 播放界面 1.播放进度显示 媒体文件在播放时的同时可以显示对应的进度,通过鼠标拖动滑块,实现快进快退功能。 void CMy2Dlg::OnOutofmemorySlider2(NMHDR* pNMHDR, LRESULT* pResult) { // TODO: Add your control notification handler code here *pResult = 0; } void CMy2Dlg::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default static r=10,g=0,b=10; if(r<250) r=r+10; else r=150; if(g<250) g=g+15; else g=5; if(b<250) b=b+20; else b=150; m_list1.SetTextColor(RGB(r,g,b)); m_list1.Invalidate(); //m_list1.UpdateWindow(); static int t=0; double position=m_slider.GetPos(); double len=m_wj.GetCurrentMedia().GetDuration(); double L=m_wj.GetControls().GetCurrentPosition(); m_slider.SetPos(int(L*100/len)); if(position==99&&s) { t++; if(t==2) { if(k&&m) { POSITION pos = m_list.GetFirstSelectedItemPosition(); Item = m_list.GetNextSelectedItem(pos); } if(Item==j-1) Item=-1; m_list1.InsertItem(0,fileName[Item+1]); m_list.SetItemText(0,1,NULL); pathName[Item+1].MakeUpper(); m_wj.SetUrl(pathName[Item+1]); if(Item Item++; //if(Item==j-1) //Item=-1; m=false; t=0; } } m_wj.GetControls().play(); CDialog::OnTimer(nIDEvent); } 2.音量调节 单击窗口水平滚动条,调节音量高低。 void CMy2Dlg::OnOutofmemorySlider1(NMHDR* pNMHDR, LRESULT* pResult) { // TODO: Add your control notification handler code here *pResult = 0; } void CMy2Dlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { // TODO: Add your message handler code here and/or call default CSliderCtrl *Slider=(CSliderCtrl*) pScrollBar; if(Slider==&m_Slider) { long position=m_Slider.GetPos(); m_wj.GetSettings().SetV olume(position); } if(Slider==&m_slider) { double len=m_wj.GetCurrentMedia().GetDuration(); KillTimer(TIMER1); double position=m_slider.GetPos(); m_wj.GetControls().SetCurrentPosition((position/100)*len); m_wj.GetControls().play(); SetTimer(TIMER1,100,0); } CDialog::OnHScroll(nSBCode, nPos, pScrollBar); } 5 运行结果界面截图 5.1 初始界面 5.2 添加文件 5.3 播放音频 5.3 播放视频 6 程序设计问题与总结 6.1 设计中遇到的问题及相应的解决方法和解决过程 1.第一次制作多媒体播放器,按钮的功能总是出现问题,写完的代码总是报错,无法实现按钮的功能。最后向同学请教,明白原因是改变了按钮的属性之后没有建立按钮的类向导,导致出现问题。解决的方法就是,在改变按钮的属性后立刻为按钮建立类向导,并在规定的位置填写实现按钮功能的代码。 2.为系统添加背景图失败,在编译运行的时候会报错。这个问题是由于添加背景图的代码填写位置不对。原本我填这段代码的时候直接把代码放在了整个代码的最后,通过查找资料得知本段代码应该填在OnPaint消息的else中,填写完成后重新编译运行,则相应的图片就会显示为播放器的背景图; 3.待解决小问题 一开始设置音量图标,通过界面不断的优化,觉得这个图标不合适,但是新的图标文件添加到Icon中,组建的时候总显示错误。 6.2 个人总结 1.关于课设 这次课程设计我做了多媒体播放器的设计,除了前文所述也就是最终的那些功能,其实有想过实现音频文件歌词的同步播放功能,但是由于很多问题无法解决就放弃了。查阅过很多资料,上网,整天的呆在图书馆,不断的出错,不断的修改完善,虽然最终的系统功能可能有点简单,界面不够好看,但用自己做的小应用播放音乐视频,还是很开心,觉得自己这几天的付出也值了。 2.感悟 当然,更重要的是,这次课设,确实锻炼了我的实际运用能力,加深了我对VC++这门课程的理解。我逐渐掌握了用MFC创建基于对话框的应用程序,同时了解了MCI相关知识。 作为编程人员,能编代码容易,但要灵活调试程序并编译通过才是难点。VC 的学习之路还很漫长,需要锻炼和学习的地方还很多但我会继续努力突破面临的种种困难。 3.对老师说的话 感谢老师在这学期对我的帮助。很感动。还记得第一次写的窗口代码(没运行成功)发到老师邮箱,老师居然回我邮件了,当时非常激动;不会忘记实验室就剩下两个学生了,老师还在指导;更不会忘记凌晨1:39的时候老师还给我们12级的各班班长发邮件通知VC大作业及实验要求......虽然只有短短半年,但老师的教诲一定铭记在心,谢谢!