暂停、停止、抓图、退出等按钮控件。
下面对各个模块的实现函数及其代码做简要分析:
(1)单击播放器界面中的“打开”按钮,即可打开要播放的媒体文件。在下述代码中,将以只读方式打开要播放的文件,并且过滤了流媒体文件的格式,获取了媒体的路径和文件名。
void CMediaPlayerDlg::OnBnClickedButtonOpen() {
CString strFilter = _T(\VI File (*.avi) | *.avi|\
strFilter += \ strFilter += \ strFilter += \
strFilter += \ //编辑下拉选项框 CFileDialog
dlg(TRUE,NULL,NULL,OFN_PATHMUSTEXIST|OFN_HIDEREADONLY, strFilter, this); //设置打开文件对话框
if (dlg.DoModal() == IDOK)//当用户打开文件时,做以下行为 { } }
(2)单击“播放”按钮后,开始选择播放的媒体文件。同时在标题栏中显示播放速率和媒体文件名,具体代码如下:
void CMediaPlayerDlg::OnBnClickedButtonPlay() {
if (m_pFilterGraph) //如果CDXGraph对象已创建成功,则执行以下代码 {
SetWindowText(_T(\倍速播放 \设置窗口标题m_pFilterGraph->Run(); //播放视频文件
m_pFilterGraph->ChangeAudioVolume(m_volume); //改变音量 栏文本内容
CreateGraph();创建链表,连接滤波器
m_sourceFile = dlg.GetPathName();//获取文件所在的路径名
m_mediaFileName =GetFileTitleFromFileName(m_sourceFile,1);//获取
文件名称
12
}
m_sliderVolume.SetPos(m_volume); //设置音量进度条的位置 if (m_playerTimer == 0) //设置定时器 { } }
(3)点击“暂停”按钮,暂停播放视频。 void CMediaPlayerDlg::OnBnClickedButtonPause()
m_playerTimer = SetTimer(SLIDER_TIMER, 100, NULL);
{ 码 { } }
(4)点击“停止”按钮,停止播放视频。 void CMediaPlayerDlg::OnBnClickedButtonStop() { 码 { } }
(5)点击“退出”按钮,退出程序。
void CMediaPlayerDlg::OnBnClickedButtonExit() {
CDialog::OnOK();//关闭窗口 OnBnClickedButtonStop();//停止播放 CoUninitialize();//关闭程序的所有线程
m_pFilterGraph->Stop();//停止播放视频
if (m_pFilterGraph != NULL)//如果CDXGraph对象不为空,则执行代m_pFilterGraph->Pause();//暂停播放视频
if (m_pFilterGraph != NULL)//如果CDXGraph对象不为空,则执行代
13
}
(6)点击“抓图”按钮,实现视频截图功能,并且将图片保存到软件的同一目录下。
void CMediaPlayerDlg::OnBnClickedButtonGrasp() {
static int c = 0;
TCHAR szFilename[MAX_PATH]; DWORD dwPathLen = 0;
if((dwPathLen=::GetModuleFileName(::AfxGetInstanceHandle(),szFilename, MAX_PATH ))== 0)//得到程序整个路径名长度 {
return; }
for( int i=dwPathLen-1; i>=0; i--)//获取图片保存的目录 {
if(('\\\\' == szFilename[i]) || ('/' == szFilename[i])) {
break; } else {
szFilename[i] = '\\0'; }
}
//设置图片保存的完整路径名称 CString str;
str.Format(_T(\
CString strTemp;
strTemp.Format(_T(\ str += strTemp + _T(\ c++;
TCHAR *p=str.GetBuffer(str.GetLength()); str.ReleaseBuffer();
//进行抓图,并且将图片放在指定路径下 if (m_pFilterGraph != NULL)
14
{ } }
(7)实现拖拽功能,使得手动拖动进度条控件,能够控制音量的大小以及视频的进度。
void CMediaPlayerDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) {
if(pScrollBar->GetSafeHwnd()==m_sliderPlayer.GetSafeHwnd()) //如果拖动消息来自视频进度条,则执行代码
{ 长度 置
}
else if(pScrollBar->GetSafeHwnd()==m_sliderVolume.GetSafeHwnd())//如果拖动消息来自音量进度条 量
}
{if (m_pFilterGraph != NULL)
{
m_volume = m_sliderVolume.GetPos();//获取音量进度条位置 m_pFilterGraph->ChangeAudioVolume(m_volume);//改变当前音}
double pos = duration * m_sliderPlayer.GetPos()/1000.0;//计算得到m_pFilterGraph->SetCurrentPosition(pos);//设置当前进度条的位
进度条位置
if (m_pFilterGraph != NULL)//CDXGraph对象不为空 {
double duration =1.0;//定义事件长度对象
m_pFilterGraph->GetDuration(&duration);//获取流媒体文件时间
if (m_pFilterGraph->SnapshotBitmap(p)) { }else
MessageBox(_T(\抓图失败!\
15
}
} else { }
CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
(8)设置静音或非静音模式 void CMediaPlayerDlg::OnMenuMute() { { } }
(9)设置全屏播放模式。
void CMediaPlayerDlg::OnMenuFullscreen() { { {
m_pFilterGraph->SetFullScreen(TRUE);//设置为全屏模式 flag = 1;//设置信号量为真
m_pFilterGraph->SetFullScreen(FALSE);//关闭全屏模式 if (!flag)//判断信号量的值是否为真,即判断当前是否为全屏 static int flag=0; //设置信号量 if (m_pFilterGraph != NULL)
static int flag=0;//设置信号量
if (!flag)//判断信号量是否为真,即判断当前是否为静音模式 { { }
m_pFilterGraph->UnMute();//设置为非静音模式 flag = 0;设置信号量为假
m_pFilterGraph->Mute();//设置为静音模式 flag = 1;//设置信号量为真
if (m_pFilterGraph != NULL)//CDXGraph对象不为空
}else
}else{
16