用VC做视频播放器.docx
《用VC做视频播放器.docx》由会员分享,可在线阅读,更多相关《用VC做视频播放器.docx(13页珍藏版)》请在冰豆网上搜索。
用VC做视频播放器
用VC做视频播放器
1利用VC6.0的MFCAppWizard创建工程
首先:
注册该控件在windows“运行”里写入:
regsvr32msdrm.ocx单击确定
1.在VC++集成开发环境中,选择菜单File|New,弹出New对话框。
2.在Projects选项卡中选择MFCAppWizard(exe),并在Location项中输入“D:
\Samples”。
3.在Projectname中输入“CTLY2412”,项中的内容自动设置为“D:
\Samples\Player”。
4.按下OK按钮,在弹出的MFCAppWizard-Step-1对话框中选择Dialogbased项,生成基于对话框的应用程序。
5.按下Finish按钮,在弹出的对话框中按下OK按钮,等待创建完相应的工程。
6.2.2为对话框添加菜单
1.在工作区中单击ResourceView选项卡,展开Dialog资源组,双击IDD_PLAYER_DIALOG。
在右边的工作台中显示可以进行可视化编辑的IDD_PLAYER_DIALOG对话框,并打开一个控件工具窗口。
删除AppWizard在对话框中生成的控件,即一个OK按钮、一个Cancel按钮和一个文本框。
2.鼠标右击Dialog资源组中的IDD_PLAYER_DIALOG条目,在弹出的菜单中选择Insert…选项。
这时,显示InsertResource(增加资源)窗口,选择其中的Menu项,单击右边的New按钮。
这样,VC++6.0在资源文件Player.rc中增加了一项资源,即一个菜单。
3.双击ID号:
IDR_MENU1,则在右边显示一个可编辑的菜单条,该菜单条的最右边是一个虚方框,表示最右边的一个菜单项。
4.双击虚方框,弹出MenuItemProperties(菜单项属性)对话框,在“C编辑”框中输入菜单标题:
文件(&F),其中“&”的作用是使其后面的字符加上下划线,让用户可用键盘来选择菜单。
另外,“O弹出”检查框默认选中,表明新加的菜单可以有其弹出的子菜单。
5.在“文件”菜单下有一个虚方框,表示要新建的菜单项。
在“C标题”编辑框中输入:
打开(&O),在ID编辑框中输入:
ID_FILEOPEN(当“O弹出”检查框未选中时,必须输入ID)。
另外,可根据需要在“M提示”编辑框中输入一串字符,提示该菜单选项功能。
当光标停在该菜单选项上时,提示字符串显示在应用程序主窗口的状态条中。
6.类似步骤5)、6),按下表6-1内容,建立完整的菜单。
表6-1媒体播放器的各菜单项属性
顶层菜单项
子菜单项
ID号
文件(&F)
打开(&O)
ID_FILEOPEN
关闭(&C)
ID_FILECLOSE
具有Separator样式的菜单分隔条
退出(&X)
ID_FILEEXIT
播放(&P)
开始(&S)
ID_PLAYSTART
暂停(&P)
ID_PLAYPAUSE
停止(&T)
ID_PLAYSTOP
视频(&V)
原始大小(&O)
ID_VIDEO1X
原始大小的2倍(&D)
ID_VIDEO2X
音频(&A)
调节音量(&V)
ID_AUDEOVOLUME
调节左右声道平衡(&B)
ID_AUDEOBALANCE
帮助(&H)
关于播放器(&A)
ID_HELPABOUT
7.给新建的菜单连接一个类
①将鼠标移至编辑状态的菜单上,单击右键,弹出快捷菜单,选择ClassWizard命令。
在显示ClassWizard窗口的同时,弹出一个AddingaClass对话框,该对话框询问是增加一个新类,还是选择一个已经存在的类进行连接。
因为我们要连接的类是与Player应用程序相关联的对话框类CPlayerDlg,此类已经存在,所以选择第二项。
②单击AddingaClass对话框中的OK按钮,显示一个SelectClass(选择类)对话框窗口,在Classlist列表中选择CPlayerDlg,单击Select按钮,确定所选项。
③单击“确定”按钮,关闭ClassWizard窗口。
现在,菜单ID_PLAYER_MENU已经和CPlayerDlg类连接起来了。
8.连接菜单和应用程序的主窗口
①在工作区中单击ResourceView选项卡,展开Dialog资源组,双击IDD_PLAYER_DIALOG。
在右边工作台中显示的IDD_PLAYER_DIALOG对话框的任何一个空白区域,单击鼠标右键,在弹出的菜单中选择Properties项,随后弹出DialogProperties对话框。
②在DialogProperties对话框中有一个“M菜单”选项。
单击“M菜单”组合框的箭头,在弹出的列表中选择IDR_MENU
9.选择File|Save命令,保存所有工作。
现在,对已存在的程序进行编译、运行
6.2.3在对话框中添加ActiveMovie控件
在对话框中单击鼠标右键,选择InsertActiveXControl命令。
在弹出的对话框中选择ActiveMovieControlObject,并按“确定”按钮。
10.为新添加的ActiveMovie控件确定ID号,为IDC_AMOVIE。
11.为IDC_AMOVIE映射一个成员变量
在ActiveMovie控件上单击右键,在弹出菜单中选择ClassWizard,在弹出的MFCClassWizard对话框中选择MemberVariables选项卡,按下AddVariable按钮,弹出对话框。
在随后弹出对话框中,按下“OK”按钮,以确定新建类:
CActiveMovie。
在弹出的AddMemberVariable对话框中确定与IDC_AMOVIE相映射的成员变量:
m_AMovie。
6.2.4完成“文件”菜单的各子菜单功能
以下的函数基本上是通过MFC的消息映射机制实现
12.实现“打开”菜单功能
①为“打开”菜单添加消息响应函数:
OnFileopen()。
②OnFileopen()函数的代码如下:
voidCTLY2412Dlg:
:
OnFileopen()
{
//TODO:
Addyourcommandhandlercodehere
//文件类型过滤
charszFileFilter[]=
"Mp3File(*.mp3)|*.mp3|"
"WmaFile(*.wma)|*.wma|"
"VideoFile(*.dat)|*.dat|"
"WaveFile(*.wav)|*.wav|"
"AVIFile(*.avi)|*.avi|"
"MovieFile(*.mov)|*.mov|"
"MediaFile(*.mmm)|*.mmm|"
"MidFile(*.mid;*,rmi)|*.mid;*.rmi|"
"MPEGFile(*.mpeg)|*.mpeg|"
"AllFile(*.*)|*.*||";
CTLY2412Dlgdlg(TRUE,NULL,NULL,OFN_HIDEREADONLY,szFileFilter);
if(dlg.DoModal()==IDOK)
{
CStringPathName=dlg.GetPathName();
PathName.MakeUpper();
m_AMovie.SetFileName(PathName);
}
}
13.实现“关闭”菜单功能
①为“关闭”菜单添加消息响应函数:
OnFileclose()。
②OnFileclose()函数的代码如下:
voidCTLY2412Dlg:
:
OnFileclose()
{
//TODO:
Addyourcommandhandlercodehere
m_AMovie.SetFileName("");
}
14.实现“退出”菜单功能
①为“退出”菜单添加消息响应函数:
OnFileexit()。
②OnFileexit()函数的代码如下:
voidCTLY2412Dlg:
:
OnFileexit()
{
//TODO:
Addyourcommandhandlercodehere
OnCancel();
}
6.2.5完成“播放”菜单的各子菜单功能
1.实现“开始”菜单功能
①为“开始”菜单添加消息响应函数:
OnPlaystart()。
②OnPlaystart()函数的代码如下:
voidCTLY2412Dlg:
:
OnPlaystart()
{
//TODO:
Addyourcommandhandlercodehere
m_AMovie.Run();
SetTimer(0,20,NULL);//设置定时器
}
2.实现“暂停”菜单功能
①为“暂停”菜单添加消息响应函数:
OnPlaypause()。
②OnPlaypause()函数的代码如下:
voidCTLY2412Dlg:
:
OnPlaypause()
{
//TODO:
Addyourcommandhandlercodehere
m_AMovie.Pause();
}
3.实现“停止”菜单功能
①为“停止”菜单添加消息响应函数:
OnPlaystop()。
②OnPlaystop()函数的代码如下:
voidCTLY2412Dlg:
:
OnPlaystop()
{
//TODO:
Addyourcommandhandlercodehere
m_AMovie.Stop();
KillTimer(0);//关掉定时器
}
4.当ActiveMovie控件完成媒体文件的加载时自动播放该文件,代码如下:
voidCTLY2412Dlg:
:
OnOpenCompleteAmovie()
{
m_AMovie.Run();
}
6.2.6完成“视频”菜单的各子菜单功能
1.实现“原始大小”菜单功能
15.编写代码完善OnInitDialog(),完整代码如下:
BOOLCTLY2412Dlg:
:
OnInitDialog()
{
CDialog:
:
OnInitDialog();
SetIcon(m_hIcon,TRUE);
SetIcon(m_hIcon,FALSE);
//设置ActiveMovie控件的初始文件为空
m_AMovie.SetFileName("");
//改变窗口的大小以适应ActiveMovie控件的大小
MoveMovieWindow();
returnTRUE;
}
16.添加CTLY2412Dlg类的成员函数MoveMovieWindow(),实现改变对话框大小以适应ActiveMovie控件的大小,其代码如下:
voidCTLY2412Dlg:
:
MoveMovieWindow()
{
CRectrc1,rc2,rc3;
//得到ActiveMovie控件的大小
m_AMovie.GetWindowRect(rc1);
//保证对话框客户区的宽不小于300像素,高不小于225像素
if(rc1.Width()<300||rc1.Height()<225)
{
rc1.right=rc1.left+300;
rc1.bottom=rc1.top+225;
}
//获得对话框的大小
GetWindowRect(rc2);
//获得对话框客户区的大小
GetClientRect(rc3);
//改变对话框的大小以适应ActiveMovie控件的大小
MoveWindow(rc2.left,rc2.top,
rc2.Width()-rc3.Width()+rc1.Width(),
rc2.Height()-rc3.Height()+rc1.Height());
//获得ActiveMovie控件的大小
m_AMovie.GetWindowRect(rc1);
GetClientRect(rc3);
//使ActiveMovie控件在对话框的客户区居中
m_AMovie.MoveWindow((rc3.Width()-rc1.Width())/2,
(rc3.Height()-rc1.Height())/2,rc1.Width(),rc1.Height());
}
③为“原始大小”菜单添加消息响应函数:
OnVideo1x()。
17.OnVideo1x()函数的代码如下:
voidCTLY2412Dlg:
:
OnVideo1x()
{
//TODO:
Addyourcommandhandlercodehere
m_AMovie.Pause();
m_AMovie.SetMovieWindowSize
(1);
m_AMovie.Run();
}
⑤另外,要完成“视频”菜单的功能,还应完成下列函数的编写
//当ActiveMovie控件的准备状态发生改变时,在需要的情况下改变对话框的大小以//适应ActiveMovie控件的大小
voidCTLY2412Dlg:
:
OnReadyStateChangeAmovie(longReadyState)
{
MoveMovieWindow();
}
//当ActiveMovie控件的状态发生改变时,在需要的情况下改变对话框的大小以适应
//ActiveMovie控件的大小
voidCTLY2412Dlg:
:
OnStateChangeAmovie(longoldState,longnewState)
{
MoveMovieWindow();
}
这两个函数都是利用MFCClassWizard添加的,方法为:
在MessageMaps标签中的ClassName项中选择CVideoPlayerDlg,在ObjectIDs中选择IDC_AMOVIE,在Messages中先后选择StateChange和ReadyStateChange,按下“确定”按钮,两个函数添加成功。
2.实现“原始大小的两倍”菜单功能
①为“原始大小的两倍”菜单添加消息响应函数:
OnVideo2x()。
②OnVideo2x()函数的代码如下:
voidCTLY2412Dlg:
:
OnVideo2x()
{
//TODO:
Addyourcommandhandlercodehere
m_AMovie.Pause();
m_AMovie.SetMovieWindowSize
(2);
m_AMovie.Run();
}
6.2.7完成“音频”菜单的各子菜单功能
1.实现“调节音量”菜单功能
18.设计“音量调节”对话框
1在工程中,插入对话框资源(方法如前所示)。
2按图6-15所示设计好“音量调节”对话框。
3使用ClassWizard为该对话框创建新的类CVolumeDlg,并为滑块控件映射类型为CSliderCtrl的成员变量m_sld。
4编写类CVolumeDlg的代码
为该类添加protect型变量,声明如:
CActiveMovie*m_pAmovie;
用MFC为该类添加成员函数voidSetVolume(CActiveMovie*pAmovie);并添加下列代码
voidCVolumeDlg:
:
SetVolume(CActiveMovie*pAmovie)
{
m_pAMovie=pAmovie;
//如果未打开任何媒体文件,则音量调节不可用。
ActiveMovie控件的//CurrentState属性返回控件的当前状态,-1表示未打开任何文件,此时弹出
//出错提示信息。
if(m_pAMovie->GetCurrentState()!
=-1)
{DoModal();}
else
{MessageBox("音频设备尚未加载,请先打开一个媒体文件。
");}
}
5通过MFC建立ON_WM_HSCROLL()的消息映射并添加下列代码
//用户拖动或点击滑块控件时,滑块控件的变化立即作用于ActiveMovie控件
voidCVolumeDlg:
:
OnHScroll(UINTnSBCode,UINTnPos,
CScrollBar*pScrollBar)
{
CSliderCtrl*pSlider=(CSliderCtrl*)pScrollBar;
intnVolume=pSlider->GetPos();
m_pAMovie->SetVolume(nVolume);
CDialog:
:
OnHScroll(nSBCode,nPos,pScrollBar);
}
6用MFC为该类添加成员函数virtualBOOLOnInitDialog();并添加下列代码
BOOLCVolumeDlg:
:
OnInitDialog()
{
CDialog:
:
OnInitDialog();
//设置音量滑块的最小值和最大值、标度和当前位置等
m_sld.SetRange(-10000,0);
m_sld.SetTicFreq(1000);
m_sld.SetLineSize(200);
m_sld.SetPageSize(1000);
//以ActiveMovie控件的当前音量作为音量滑块的当前位置
m_sld.SetPos(m_pAMovie->GetVolume());
returnTRUE;
}
7为“调节音量”菜单添加消息响应函数:
OnAudeovolume()。
OnAudeovolume()函数的代码如下:
voidCTLY2412Dlg:
:
OnAudeovolume()
{
//TODO:
Addyourcommandhandlercodehere
CVolumeDlgdlgVolum;
dlgVolum.SetVolum(&m_AMovie);
}
在该类的头文件里加上#include"activemovie3.h"和#include"VolumeDlg.h"
2.实现“调节左右声道平衡”菜单功能
(1)设计“调节左右声道平衡”对话框
1如图6-16所示设计“调节左右声道平衡”对话框。
2由ClassWizard创建的新类CBalanceDlg封装了该对话框。
同前面的对话框IDD_VOLUME相类似,CBalanceDlg定义