用VC做视频播放器

三设计过程和算法描述(宋体,四号)

621 利用VC6.0MFC AppWizard创建工程

首先:注册该控件在windows“运行”里写入:regsvr32 msdrm.ocx 单击确定

 

1.在VC++集成开发环境中,选择菜单File|New,弹出New对话框。

2. 在Projects选项卡中选择MFC AppWizardexe),并在Location项中输入“D/Samples”

3.在Project name中输入“ CTLY2412,项中的内容自动设置为“D/Samples/Player”

4.按下OK按钮,在弹出的MFC AppWizard-Step-1对话框中选择Dialog based项,生成基于对话框的应用程序。

5.按下Finish按钮,在弹出的对话框中按下OK按钮,等待创建完相应的工程。

 

622 为对话框添加菜单

 

1.在工作区中单击Resource View选项卡,展开Dialog资源组,双击IDD_PLAYER_DIALOG。在右边的工作台中显示可以进行可视化编辑的IDD_PLAYER_DIALOG对话框,并打开一个控件工具窗口。删除AppWizard在对话框中生成的控件,即一个OK按钮、一个Cancel按钮和一个文本框。

  1. 鼠标右击Dialog资源组中的IDD_PLAYER_DIALOG条目,在弹出的菜单中选择Insert…选项。这时,显示Insert Resource(增加资源)窗口,选择其中的Menu项,单击右边的New按钮。这样,VC++6.0在资源文件Player.rc中增加了一项资源,即一个菜单。

  2. 双击ID号:IDR_MENU1,则在右边显示一个可编辑的菜单条,该菜单条的最右边是一个虚方框,表示最右边的一个菜单项。

  3. 双击虚方框,弹出Menu Item Properties(菜单项属性)对话框,在“C编辑”框中输入菜单标题:文件(&F),其中“&”的作用是使其后面的字符加上下划线,让用户可用键盘来选择菜单。另外,“O弹出”检查框默认选中,表明新加的菜单可以有其弹出的子菜单。

  4. 在“文件”菜单下有一个虚方框,表示要新建的菜单项。在“C标题”编辑框中输入:打开(&O),在ID编辑框中输入:ID_FILEOPEN(当“O弹出”检查框未选中时,必须输入ID)。另外,可根据需要在“M提示”编辑框中输入一串字符,提示该菜单选项功能。当光标停在该菜单选项上时,提示字符串显示在应用程序主窗口的状态条中。

  5. 类似步骤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

 

  1. 给新建的菜单连接一个类

将鼠标移至编辑状态的菜单上,单击右键,弹出快捷菜单,选择ClassWizard命令。在显示ClassWizard窗口的同时,弹出一个Adding a Class对话框,该对话框询问是增加一个新类,还是选择一个已经存在的类进行连接。因为我们要连接的类是与Player应用程序相关联的对话框类CPlayerDlg,此类已经存在,所以选择第二项。

单击Adding a Class对话框中的OK按钮,显示一个Select Class(选择类)对话框窗口,在Class list列表中选择CPlayerDlg,单击Select按钮,确定所选项。

 

单击“确定”按钮,关闭ClassWizard窗口。现在,菜单ID_PLAYER_MENU已经和CPlayerDlg类连接起来了。

  1. 连接菜单和应用程序的主窗口

在工作区中单击Resource View选项卡,展开Dialog资源组,双击 IDD_PLAYER_DIALOG。在右边工作台中显示的IDD_PLAYER_DIALOG对话框的任何一个空白区域,单击鼠标右键,在弹出的菜单中选择Properties项,随后弹出Dialog Properties对话框。

Dialog Properties对话框中有一个“M菜单”选项。单击“M菜单”组合框的箭头,在弹出的列表中选择IDR_MENU

  1. 选择File|Save命令,保存所有工作。

现在,对已存在的程序进行编译、运行

623在对话框中添加ActiveMovie控件

 

在对话框中单击鼠标右键,选择Insert ActiveX Control命令。在弹出的对话框中选择ActiveMovieControl Object,并按“确定”按钮。

  1. 为新添加的ActiveMovie控件确定ID号,为IDC_AMOVIE

  2. IDC_AMOVIE映射一个成员变量

ActiveMovie控件上单击右键,在弹出菜单中选择ClassWizard,在弹出的MFC ClassWizard对话框中选择Member Variables选项卡,按下Add Variable按钮,弹出对话框。在随后弹出对话框中,按下“OK”按钮,以确定新建类:CActiveMovie。在弹出的Add Member Variable对话框中确定与IDC_AMOVIE相映射的成员变量:m_AMovie

624 完成“文件”菜单的各子菜单功能

以下的函数基本上是通过MFC的消息映射机制实现

 

  1. 实现“打开”菜单功能

为“打开”菜单添加消息响应函数:OnFileopen()

OnFileopen()函数的代码如下:

void CTLY2412Dlg::OnFileopen()

{

// TODO: Add your command handler code here

//文件类型过滤

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|"

"Media File(*.mmm)|*.mmm|"

"Mid File(*.mid;*,rmi)|*.mid;*.rmi|"

"MPEG File(*.mpeg)|*.mpeg|"

"All File(*.*)|*.*||";

CTLY2412Dlg dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY,szFileFilter);

if(dlg.DoModal()==IDOK)

{

CString PathName=dlg.GetPathName();

PathName.MakeUpper();

m_AMovie.SetFileName(PathName);

}

}

 

  1. 实现“关闭”菜单功能

为“关闭”菜单添加消息响应函数:OnFileclose()

OnFileclose()函数的代码如下:

void CTLY2412Dlg::OnFileclose()

{

// TODO: Add your command handler code here

m_AMovie.SetFileName("");

}

  1. 实现“退出”菜单功能

为“退出”菜单添加消息响应函数:OnFileexit()

OnFileexit()函数的代码如下:

void CTLY2412Dlg::OnFileexit()

{

// TODO: Add your command handler code here

OnCancel();

}

 

625 完成“播放”菜单的各子菜单功能

 

1.实现“开始”菜单功能

为“开始”菜单添加消息响应函数:OnPlaystart()

OnPlaystart()函数的代码如下:

void CTLY2412Dlg::OnPlaystart()

{

// TODO: Add your command handler code here

m_AMovie.Run();

SetTimer(0,20,NULL);//设置定时器

}

2.实现“暂停”菜单功能

为“暂停”菜单添加消息响应函数:OnPlaypause()

OnPlaypause()函数的代码如下:

void CTLY2412Dlg::OnPlaypause()

{

// TODO: Add your command handler code here

m_AMovie.Pause();

}

3.实现“停止”菜单功能

为“停止”菜单添加消息响应函数:OnPlaystop()

OnPlaystop()函数的代码如下:

void CTLY2412Dlg::OnPlaystop()

{

// TODO: Add your command handler code here

m_AMovie.Stop();

KillTimer(0);//关掉定时器

}

4ActiveMovie 控件完成媒体文件的加载时自动播放该文件,代码如下:

void CTLY2412Dlg::OnOpenCompleteAmovie()

{

m_AMovie.Run();

}

 

626 完成“视频”菜单的各子菜单功能

 

1.实现“原始大小”菜单功能

  1. 编写代码完善OnInitDialog(),完整代码如下:

BOOL CTLY2412Dlg::OnInitDialog()

{

CDialog::OnInitDialog();

SetIcon(m_hIcon, TRUE);

SetIcon(m_hIcon, FALSE);

// 设置 ActiveMovie 控件的初始文件为空

m_AMovie.SetFileName("");

// 改变窗口的大小以适应 ActiveMovie 控件的大小

MoveMovieWindow();

return TRUE;

}

 

  1. 添加CTLY2412Dlg类的成员函数MoveMovieWindow(),实现改变对话框大小以适应 ActiveMovie 控件的大小,其代码如下:

void CTLY2412Dlg::MoveMovieWindow()

{

CRect rc1, 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()

  1. OnVideo1x()函数的代码如下:

void CTLY2412Dlg::OnVideo1x()

{

// TODO: Add your command handler code here

m_AMovie.Pause();

m_AMovie.SetMovieWindowSize(1);

m_AMovie.Run();

}

另外,要完成“视频”菜单的功能,还应完成下列函数的编写

// ActiveMovie 控件的准备状态发生改变时,在需要的情况下改变对话框的大小以// 适应 ActiveMovie 控件的大小

void CTLY2412Dlg::OnReadyStateChangeAmovie(long ReadyState)

{

MoveMovieWindow();

}

// ActiveMovie 控件的状态发生改变时,在需要的情况下改变对话框的大小以适应

// ActiveMovie 控件的大小

void CTLY2412Dlg::OnStateChangeAmovie(long oldState, long newState)

{

MoveMovieWindow();

}

这两个函数都是利用MFC ClassWizard添加的,方法为:在Message Maps标签中的Class Name项中选择 CVideoPlayerDlg,在Object IDs中选择 IDC_AMOVIE,在Messages中先后选择 StateChangeReadyStateChange,按下“确定”按钮,两个函数添加成功。

2.实现“原始大小的两倍”菜单功能

为“原始大小的两倍”菜单添加消息响应函数:OnVideo2x()

OnVideo2x()函数的代码如下:

void CTLY2412Dlg::OnVideo2x()

{

// TODO: Add your command handler code here

m_AMovie.Pause();

m_AMovie.SetMovieWindowSize(2);

m_AMovie.Run();

}

 

627 完成“音频”菜单的各子菜单功能

 

1.实现“调节音量”菜单功能

  1. 设计“音量调节”对话框

1 在工程中,插入对话框资源(方法如前所示)。

2 按图6-15所示设计好“音量调节”对话框。

 

3 使用ClassWizard为该对话框创建新的类CVolumeDlg,并为滑块控件映射类型为CSliderCtrl的成员变量m_sld

4 编写类CVolumeDlg的代码

为该类添加protect型变量,声明如:CActiveMovie *m_pAmovie;

 

MFC为该类添加成员函数void SetVolume(CActiveMovie* pAmovie);并添加下列代码

void CVolumeDlg::SetVolume(CActiveMovie * pAmovie)

{

m_pAMovie=pAmovie;

// 如果未打开任何媒体文件,则音量调节不可用。ActiveMovie 控件的 // CurrentState 属性返回控件的当前状态,-1 表示未打开任何文件,此时弹出

// 出错提示信息。

if (m_pAMovie->GetCurrentState()!=-1)

{ DoModal(); }

else

{ MessageBox("音频设备尚未加载,请先打开一个媒体文件。"); }

}

 

5通过MFC建立ON_WM_HSCROLL( )的消息映射并添加下列代码

// 用户拖动或点击滑块控件时,滑块控件的变化立即作用于 ActiveMovie 控件

void CVolumeDlg::OnHScroll(UINT nSBCode, UINT nPos,

CScrollBar* pScrollBar)

{

CSliderCtrl *pSlider=(CSliderCtrl *)pScrollBar;

int nVolume=pSlider->GetPos();

m_pAMovie->SetVolume(nVolume);

CDialog::OnHScroll(nSBCode, nPos, pScrollBar);

}

 

6MFC为该类添加成员函数virtual BOOL OnInitDialog();并添加下列代码

 

 

BOOL CVolumeDlg::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());

return TRUE;

}

7为“调节音量”菜单添加消息响应函数:OnAudeovolume()

OnAudeovolume()函数的代码如下:

void CTLY2412Dlg::OnAudeovolume()

{

// TODO: Add your command handler code here

CVolumeDlg dlgVolum;

dlgVolum.SetVolum(&m_AMovie);

}

在该类的头文件里加上#include "activemovie3.h"#include "VolumeDlg.h"

2.实现“调节左右声道平衡”菜单功能

1)设计“调节左右声道平衡”对话框

1 如图6-16所示设计“调节左右声道平衡”对话框。

2 ClassWizard创建的新类CBalanceDlg封装了该对话框。同前面的对话框 IDD_VOLUME相类似,CBalanceDlg定义

展开阅读全文

没有更多推荐了,返回首页