上篇文章分析了一个封装DirectShow各种接口的封装类(CDXGraph):一个简单的基于 DirectShow 的播放器 1(封装类)
本文继续上篇文章,分析一下调用这个封装类(CDXGraph)的对话框类(CSimplePlayerDlg),看看在MFC中如何使用这个类(CDXGraph)。
首先来看看CSimplePlayerDlg这个类的定义,瞧瞧SimplePlayerDlg.h这个头文件。
/* 雷霄骅
* 中国传媒大学/数字电视技术
* leixiaohua1020@126.com
*
*/
// SimplePlayerDlg.h : header file
//
#if !defined(AFX_SIMPLEPLAYERDLG_H__3599FE35_3322_4CC7_B30B_6D6050C2EDFF__INCLUDED_)
#define AFX_SIMPLEPLAYERDLG_H__3599FE35_3322_4CC7_B30B_6D6050C2EDFF__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
/////////////////////////////////////////////////////////////////////////////
// CSimplePlayerDlg dialog
#include <streams.h>
#include "CDXGraph.h"
#define SLIDER_TIMER 100
class CSimplePlayerDlg : public CDialog
{
// Construction
public:
CSimplePlayerDlg(CWnd* pParent = NULL); // standard constructor
~CSimplePlayerDlg();
// Dialog Data
//{{AFX_DATA(CSimplePlayerDlg)
enum { IDD = IDD_SIMPLEPLAYER_DIALOG };
CSliderCtrl mSliderGraph;
CStatic mVideoWindow;
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CSimplePlayerDlg)
public:
virtual BOOL PreTranslateMessage(MSG* pMsg);
virtual BOOL DestroyWindow();
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
HICON m_hIcon;
CDXGraph * mFilterGraph; // Filter Graph封装
CString mSourceFile; // 源文件
UINT mSliderTimer; // 定时器ID
//创建Graph
void CreateGraph(void); // 创建Filter Graph
void DestroyGraph(void); // 析构Filter Graph
void RestoreFromFullScreen(void);
// Just for testing...
HRESULT FindFilterByInterface(REFIID riid, IBaseFilter** ppFilter);
void ShowVRPropertyPage(void);
// Generated message map functions
//{{AFX_MSG(CSimplePlayerDlg)
virtual BOOL OnInitDialog();
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
//打开
afx_msg void OnButtonOpen();
//播放
afx_msg void OnButtonPlay();
//暂停
afx_msg void OnButtonPause();
//停止
afx_msg void OnButtonStop();
afx_msg void OnButtonGrab();
afx_msg void OnButtonFullscreen();
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
afx_msg void OnTimer(UINT nIDEvent);
afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
afx_msg void OnButtonTest();
//}}AFX_MSG
afx_msg LRESULT OnGraphNotify(WPARAM inWParam, LPARAM inLParam);
DECLARE_MESSAGE_MAP()
};
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_SIMPLEPLAYERDLG_H__3599FE35_3322_4CC7_B30B_6D6050C2EDFF__INCLUDED_)
从头文件来看,和普通的MFC对话框类并没有什么不同,无非是一些消息响应函数,或者MFC控件对应的类。需要注意一下,有一个变量:
CDXGraph * mFilterGraph
接下来看看CSimplePlayerDlg函数的实现部分吧。
OnButtonOpen():打开媒体文件按钮的响应函数
//打开
void CSimplePlayerDlg::OnButtonOpen()
{
// TODO: Add your control notification handler code here
CString strFilter = "AVI File (*.avi)|*.avi|";
strFilter += "MPEG File (*.mpg;*.mpeg)|*.mpg;*.mpeg|";
strFilter += "Mp3 File (*.mp3)|*.mp3|";
strFilter += "Wave File (*.wav)|*.wav|";
strFilter += "All Files (*.*)|*.*|";
CFileDialog dlgOpen(TRUE, NULL, NULL, OFN_PATHMUSTEXIST | OFN_HIDEREADONLY,
strFilter, this);
if (IDOK == dlgOpen.DoModal())
{
mSourceFile = dlgOpen.GetPathName();
// Rebuild the file playback filter graph
//创建Graph
CreateGraph();
}
}
其中CreateGraph()函数如下所示:
//创建Graph
void CSimplePlayerDlg::CreateGraph(void)
{
//(如果有)销毁Graph
DestroyGraph();
//新建一个核心类
mFilterGraph = new CDXGraph();
if (mFilterGraph->Create())
{
// Render the source clip
mFilterGraph->RenderFile(mSourceFile);
// Set video window and notification window
mFilterGraph->SetDisplayWindow(mVideoWindow.GetSafeHwnd());
mFilterGraph->SetNotifyWindow(this->GetSafeHwnd());
// Show the first frame
mFilterGraph->Pause();
}
}
与CreateGraph()相反的还有一个DestroyGraph()
//(如果有)销毁Graph
void CSimplePlayerDlg::DestroyGraph(void)
{
if (mFilterGraph)
{
// Stop the filter graph first
mFilterGraph->Stop();
mFilterGraph->SetNotifyWindow(NULL);
delete mFilterGraph;
mFilterGraph = NULL;
}
}
OnButtonPlay():播放按钮的响应函数
//播放
void CSimplePlayerDlg::OnButtonPlay()
{
if (mFilterGraph)
{
mFilterGraph->Run();
// Start a timer
if (mSliderTimer == 0)
{
mSliderTimer = SetTimer(SLIDER_TIMER, 100, NULL);
}
}
}
OnButtonPause():暂停按钮的响应函数
void CSimplePlayerDlg::OnButtonPause()
{
if (mFilterGraph)
{
mFilterGraph->Pause();
// Start a timer
if (mSliderTimer == 0)
{
mSliderTimer = SetTimer(SLIDER_TIMER, 100, NULL);
}
}
}
OnButtonStop():停止按钮的响应函数
void CSimplePlayerDlg::OnButtonStop()
{
if (mFilterGraph)
{
mFilterGraph->SetCurrentPosition(0);
mFilterGraph->Stop();
// Stop the timer
if (mSliderTimer)
{
KillTimer(mSliderTimer);
mSliderTimer = 0;
}
}
}
其他的函数不再一一列举,但意思都是一样的。
播放器源代码下载:http://download.csdn.net/detail/leixiaohua1020/6453467
分享到:
相关推荐
一个比较好用的VC对话框类,比较有用,在一些工程项目中可以参考使用
如何在对话框类内调用视图cview类中的函数和变量
建立一个单文档mfc程序,设计一个菜单按钮,可以弹出一个对话框。在对话框中使用视图类和框架类中的变量。说明:http://blog.csdn.net/tywwwww/article/details/55281565
VC 自动关闭对话框类.zip VC 自动关闭对话框类.zip VC 自动关闭对话框类.zip
http://blog.csdn.net/wlsgzl/article/details/8502106 之前有人问有没有教程的代码,我就花时间写了个简单的。
vc6写的文件夹对话框类。特别好用。供大家学习参考!
为了解决这个问题,我写了一个自动改变控件位置和大小的对话框类ClxDialog。从这个类继承的对话框类,只要在OnInitDialog()里对控件做一些简单的设置,对话框上的控件就会随着对话框大小的改变而改变自己的位置和...
在使用MFC编程的时候,对话框通常是通过RC资源文件来创建的。在有些时候动态创建对话框更加方便,尤其是便于代码重用。 该类实现了动态创建对话框的方法。 (内附使用方法)
vc++打开目录对话框类,自定义类,使用简单,附有使用方法
Visual_C++向对话框类中添加工具栏
Symbian中自定义对话框类,使用的开发工具:ActivePerl5.6.1、carbide.C++、s60 3rd.
confirm对话框类,msgshow(ByVal handle As System.Web.UI.Page, ByVal js_fuc_name As String, ByVal btn_ok As String, ByVal btn_cancel As String);handle调用该类的页面句柄,js_fuc_name 自动生成JS函数的...
SQLServer Search Dialog Classsql服务器搜寻对话框类
半透明模式对话框类,支持IE,FF浏览器.解决浏览器提示“internet explore 无法打开nternet站点 已终止操作”
压缩包内包含.cpp和.h文件,实现自动改变控件位置和大小的对话框类
DLL输出对话框类的例子解压密码:hur.cn或vip.hur.cn.rar
NULL 博文链接:https://snandy.iteye.com/blog/834181
扩展的对话框资源类,可定制各种MFC中没有的控件。详见附件。
通用对话框类自己收藏的源码,特意贡献给大家
通过使用vs2008中vc++mfc平台开发的简单的计算器,该系统可以计算简单的加减乘除,指数运算。