《Windows编程》大作业
题 目:基于MFC的视频播放器 姓 名:钱婷
学 号:1205110205
班 级:软工1201
专 业:软件工程
院 系:数学与计算机学院 指导教师:刘文涛
视频播放器的制作
一、题目介绍
制作一个能够播放音频、视频文件的播放器,并使它具备一些简单的操作处理功能,如播放暂停的控制,音量的调节,多文件自动循环等等。将这个小型播放软件做得尽量的小巧、实用。
二、系统分析
2.1 技术分析
此程序采用模块化程序设计方法,既便于软件功能的各种组合和修改,又便于技术维护人员进行补充、维护,尽量利用人们现有的软件环境,采用简单快捷的设计方案,从而达到使用方便,容易操作的目的,满足大多数人日常使用的需要,并达到操作过程的直观、方便、实用、 安全等要求。
2.2 开发工具
开发工具:Microsoft Visual C++ 6 .0
开发语言:C++ 运行支持环境:
硬件环境: CPU 1.0G以上
内存256M以上
硬盘20G以上
操作系统:Microsoft Windows 2000,XP,VISTA,Windows 7
2.3 开发平台介绍
Visual C++ 6.0。它是微软公司推出的开发Win32应用程序,面向对象的可视化集成工具。它的最大优点就是提供了功能强大的MFC类库,MFC是一个很大的C++类层次结构,其中封装了大量的类及其函数,很多Windows程序所共有的标准内容可以由MFC的类来提供,MFC类为这些内容提供了用户接口的标准实现方法,程序员所要做的就是通过预定义的接口把具体应用程序特有的东西填入这个轮廓,这将简化编程工作,大大的减少程序员编写的代码数量,使编程工作变得更加轻松容易。它本身不仅具有极其强大的编程能力,它允许选择和管理外接程序,并内含多种实用控件,这些对Visual C++的扩充又进一步增强了它的开发环境的能力。
三、功能实现
3.1 功能说明
结合Windows Media Player控件可以实现基本的播放常用视频格式的功能和基本操作功能,例如开始,停止,声音调节等所有功能。除此之外,还应该能添加文件到播放器播放列表,并保存播放列表,以及播放器最大化、
播放器的退出功能。
3.2 窗体设计
本播放器效仿现在主流的播放器的界面——播放器左边为播放窗体,右边为播放列表。另外,由于能力限制,只是粗略的添加了几个播放控制项,加在了播放窗体和播放列表之间。
3.3 模块设计
程序的功能模块图如图3.2.1:
图3.2.1 播放器的功能模块图
四、功能测试
4.1 系统运行环境
MFC(Microsoft Foundation Classes),是一个微软公司提供的类库
(class libraries),以C++类的形式封装了Windows的API。并且包含一个应用程序框架,以减少应用程序人员的工作量。其中包含的类包含大量的Windows句柄封装类和很多Windows的内建控件和组建的封装类。
Windows Media Player 包括用于呈现音频和视频的Microsoft ActiveX控件。该控件可在任何运行Windows Media Player的计算机上获得。Windows Media Player是一种独立的技术,此外,它还包括了一个ActiveX控件形式的组件对象模型(com)服务器(Player与ActiveX控件之间的关系相当于Microsoft Internet Explorer与其所提供的WebBrowser ActiveX控件之间的关系)。有两种方法可用于创建使用Windows Media Player ActiveX控件的应用程序。你可以在Web应用程序中使用该控件,也可以在基于Windows的应用程序中使用它。
4.2 测试截图
1) 播放器界面的创建
创建对话框模式的播放器界面,在界面添加功能按钮,功能按钮有添加
文件,保存列表,播放文件,播放文件,退出程序,其中播放列表为添加一个列表框。如图
4.2.1
图4.2.1 播放器界面
播放控件为Windows Madia Player,Windows Media Player为最终用户提供了各种信息和功能,但是,你可能需要提供自定义交互或自定义数据,使用用户页面插件可完成此项工作。
为列表框空间添加名为m_list的CListBox控件类型变量,为播放插件添加名为m_player的CWMPPlayer4控件类型变量。为后面完成相应的操作和功能准备。
2) 添加模块的实现
点击“添加文件”功能按钮,打开文件对话框,让用户选择媒体文件,并将文件名添加到播放列表。为实现这一需求,使用MFC通用对话框完成,这里设置媒体文件为常用的“*.avi,*.mp3,*.mp4,*.wma,*.rmvb”。代码如下
void CMFCDlg::OnAdd()
{
char szFileFilter[]="媒体文件CFileDialog (*.avi,*.mp3,*.mp4,*.wma,*.rmvb)|*.avi;*.mp3;*.mp4;*.wma;*.rmvb|";
dlg(true,NULL,NULL,OFN_HIDEREADONLY|OFN_ALLOWMULTISELECT|OFN_NOCHANGEDIR,szFileFilter);
POSITION pos = dlg.GetStartPosition(); if(dlg.DoModal()==IDOK){ while(pos!=NULL){ m_pathname=dlg.GetNextPathName(pos);
} } } m_list.AddString(m_pathname);
实际效果如截图
4.2.2
图4.2.2 添加媒体文件
3) 保存模块的实现
保存模块的功能是将播放列表保存,方便下次打开播放器时,播放列表仍显示上次保存的结果。这里使用CStdiFile来操纵流数据,从而实现保存功能。代码如下:
void CMFCDlg::OnSave()
{
}
点击“保存列表”后,将在工程目录下发现list.txt文件,使用记事本打开即可检查列表是否成功保存。图4.2.3为保存成功截图 CStdioFile file; file.Open(".\\list.txt",CFile::modeCreate|CFile::modeReadWrite|CFile::tyfor(int i=0; i<m_list.GetCount();i++){ } file.Close(); CString strtemp; m_list.GetText(i,strtemp); strtemp+="\n"; file.WriteString(strtemp); peText);
图4.2.3 播放列表保存成功
列表保存后,关闭播放器,再次打开播放器,为了让播放列表加载进列表框,还需在播放器的初始化时读取磁盘中保存的列表。
BOOL CMFCDlg::OnInitDialog()
{
......
}
下图为播放器保存列表后重启播放器后的界面图,可以看到保存的列表数据还在:
m_list.SetHorizontalExtent(1000); CStdioFile *fsp = new CStdioFile(".\\list.txt",CFile::modeRead); CString str; while(fsp->ReadString(str)){ } fsp->Close(); delete fsp; m_list.AddString(str);
图4.2.4 显示保存的播放列表
4) 退出模块的实现
退出模块只需实现简单的结束程序的运行即可。
void CMFCDlg::OnExit()
{
}
5) 播放模块的实现
播放指定文件可通过选中播放列表中文件名双击鼠标或者单击鼠标左键选中播放列表中指定文件名然后点击功能按钮“播放文件”来实现。所以利用ClassWizard给列表框添加LBN_DBLCLK消息,编辑响应函数:
void CMFCDlg::OnDblclkList1()
{
}
下图为播放歌曲和播放视频的界面图:
CString str; int index = m_list.GetCurSel(); m_list.GetText(index,str); m_player.SetUrl(str); m_pathname=str; CDialog::OnCancel();
图4.2.5 播放歌曲
图4.2.6 播放视频
给“播放文件”按钮添加BN_CLICKED消息,编辑该消息的响应函数: void CMFCDlg::OnPlay()
{
}
6)全屏模块的实现
全屏是现在流行的播放器所必须的功能,实现的思想是能将播放器窗口最大化,退出全屏后能还原为最初尺寸。所以在播放器初始化的时候应该计算窗口的尺寸。
CRect rect;
::GetWindowRect(m_hWnd,rect);//这里m_hWnd为窗口句柄,如果不存在此变量则在该行代码前加一句:HWND h_Wnd=GetSafeHwnd( );
ScreenToClient(rect);
LONG m_nDlgWidth = rect.right - rect.left;
LONG m_nDlgHeight = rect.bottom - rect.top;
//Calc 分辨率
LONG m_nWidth = GetSystemMetrics(SM_CXSCREEN);
LONG m_nHeight = GetSystemMetrics(SM_CYSCREEN);
//计算放大倍数(要用float值,否则误差很大) CString str; int index = m_list.GetCurSel(); m_list.GetText(index,str); m_pathname=str; m_player.SetUrl(m_pathname);
m_Multiple_width = float(m_nWidth)/float(m_nDlgWidth);
m_Multiple_height = float(m_nHeight)/float(m_nDlgHeight);
change_flag = TRUE;//用来判断OnSize执行时,OninitDialg是否已经执行了
给播放器添加WM_SIZE消息,该消息负责对窗口尺寸改变做出处理,编辑该消息的响应函数:
void CMFCDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy); // TODO: Add your message handler code here if (change_flag)//如果OninitDlg已经调用完毕
{
ReSize(IDC_OCX1);
ReSize(IDC_LIST1);
ReSize(IDC_ADD);
ReSize(IDC_SAVE);
ReSize(IDC_EXIT);
ReSize(IDC_PLAY);
ReSize(IDC_CONTROL_LIST); ReSize(IDC_STATIC);
//恢复放大倍数,并保存 (确保还原时候能够还原到原来的大小) m_Multiple_width = float(1)/m_Multiple_width;
m_Multiple_height = float(1)/m_Multiple_height;
}
}
void CMFCDlg::ReSize(int nID)
{
CRect Rect;
GetDlgItem(nID)->GetWindowRect(Rect);
ScreenToClient(Rect);
//计算控件左上角点
CPoint OldTLPoint,TLPoint;
OldTLPoint = Rect.TopLeft();
TLPoint.x = long(OldTLPoint.x *m_Multiple_width);
TLPoint.y = long(OldTLPoint.y * m_Multiple_height );
//计算控件右下角点
CPoint OldBRPoint,BRPoint; OldBRPoint = Rect.BottomRight();
BRPoint.x = long(OldBRPoint.x *m_Multiple_width);
BRPoint.y = long(OldBRPoint.y * m_Multiple_height );
//移动控件到新矩形
Rect.SetRect(TLPoint,BRPoint);
GetDlgItem(nID)->MoveWindow(Rect,TRUE);
}
下图为点击全屏按钮后的示意图:
图4.2.7 全屏示意图
五、总结
通过对本课程设计的完成,熟悉了基于MFC的应用开发的一般流程,熟悉了利用Visual C++开发各种应用程序的步骤与一些基本方法与技巧,还知道了一些程序的调试技巧。通过对Visual C++课程设计的实践,可以进一步巩固自己的所学,熟悉了C++语言,同时加强了自己时间动手的能力,如何查找资料,发现问题后如何解决等。总的来说本次课程设计,收获颇丰。在前面实现播放等基本功能时候并没有遇到太大的困难,这要基于强大的多媒体控制接口,只要简单的发送一些命令便可以实现这些基本功能。不管怎样,还是得继续努力。
六、参考文献
[1]马石安 。Visual C++程序设计与应用教程(第二版)。北京:清华大学出版社。
《Windows编程》考核报告
日期:_____ 年___ 月____ 日
下面是官方资料宽带连接错误代码大全发生内部错误重新启动计算机以确保所有最近所作的配置更改都能生效601检测到无效的端口句柄发生内部…
很多用户在为电脑清理垃圾的时候都会发现电脑存在很多的垃圾并且这些垃圾占用了系统很大的空间影响到系统的运行速度导致电脑出现windo…
windowsXP中错误报告电脑的应用有很强的技术性同时又有很强的经验性但经验性会误导用户只记步骤或只专注于部分功能如只记步骤则对…
Windows编程实验报告1GDI图形程序设计姓名专业学号框架窗口程序和20xx3241Windows编程实验报告1Windows…
苏州市职业大学实习实训报告名称20xx年12月24日至20xx年12月28日共1周院系计算机工程系班级11网络技术1班姓名系主任教…
Windows编程实验报告1GDI图形程序设计姓名专业学号框架窗口程序和20xx3241Windows编程实验报告1Windows…
操作系统实验报告windows部分班级姓名学号31Windows任务管理器的进程管理实验估计时间60分钟实验目的工具准备工作背景知…
实验报告册课程计算机组装与维护姓名刘蓉学号101124004专业信息技术学院班级10网络指导老师赵秀英20xx至20xx学年第2学…
windowsXP中错误报告电脑的应用有很强的技术性同时又有很强的经验性但经验性会误导用户只记步骤或只专注于部分功能如只记步骤则对…
下面是官方资料宽带连接错误代码大全发生内部错误重新启动计算机以确保所有最近所作的配置更改都能生效601检测到无效的端口句柄发生内部…