上篇文章分析了一个封装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   100class 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//创建Graphvoid CreateGraph(void);        // 创建Filter Graphvoid DestroyGraph(void);       // 析构Filter Graphvoid 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_MSGafx_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 hereCString    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//创建GraphCreateGraph();}
}

其中CreateGraph()函数如下所示:

//创建Graph
void CSimplePlayerDlg::CreateGraph(void)
{//(如果有)销毁GraphDestroyGraph();//新建一个核心类mFilterGraph = new CDXGraph();if (mFilterGraph->Create()){// Render the source clipmFilterGraph->RenderFile(mSourceFile);// Set video window and notification windowmFilterGraph->SetDisplayWindow(mVideoWindow.GetSafeHwnd());mFilterGraph->SetNotifyWindow(this->GetSafeHwnd());// Show the first framemFilterGraph->Pause();}
}

与CreateGraph()相反的还有一个DestroyGraph()

//(如果有)销毁Graph
void CSimplePlayerDlg::DestroyGraph(void)
{if (mFilterGraph){// Stop the filter graph firstmFilterGraph->Stop();mFilterGraph->SetNotifyWindow(NULL);delete mFilterGraph;mFilterGraph = NULL;}
}

OnButtonPlay():播放按钮的响应函数

//播放
void CSimplePlayerDlg::OnButtonPlay()
{if (mFilterGraph){mFilterGraph->Run();// Start a timerif (mSliderTimer == 0){mSliderTimer = SetTimer(SLIDER_TIMER, 100, NULL);}}
}

OnButtonPause():暂停按钮的响应函数

void CSimplePlayerDlg::OnButtonPause()
{if (mFilterGraph){mFilterGraph->Pause();// Start a timerif (mSliderTimer == 0){mSliderTimer = SetTimer(SLIDER_TIMER, 100, NULL);}}
}

OnButtonStop():停止按钮的响应函数

void CSimplePlayerDlg::OnButtonStop()
{if (mFilterGraph){mFilterGraph->SetCurrentPosition(0);mFilterGraph->Stop();// Stop the timerif (mSliderTimer){KillTimer(mSliderTimer);mSliderTimer = 0;}}
}

其他的函数不再一一列举,但意思都是一样的。

播放器源代码下载:http://download.csdn.net/detail/leixiaohua1020/6453467

一个简单的基于 DirectShow 的播放器 2(对话框类)相关推荐

  1. 一个简单的基于 DirectShow 的播放器 1(封装类)

    DirectShow最主要的功能就是播放视频,在这里介绍一个简单的基于DirectShow的播放器的例子,是用MFC做的,今后有机会可以基于该播放器开发更复杂的播放器软件. 注:该例子取自于<D ...

  2. 最简单的基于 DirectShow 的视频播放器

    源程序下载链接:https://download.csdn.net/download/bmjhappy/11250669 50行代码实现的一个最简单的基于 DirectShow 的视频播放器 本文介绍 ...

  3. 转:最简单的基于 DirectShow 的视频播放器

    50行代码实现的一个最简单的基于 DirectShow 的视频播放器 本文介绍一个最简单的基于 DirectShow 的视频播放器.该播放器对于初学者来说是十分有用的,它包含了使用 DirectSho ...

  4. 50行代码实现的一个最简单的基于 DirectShow 的视频播放器

    本文介绍一个最简单的基于 DirectShow 的视频播放器.该播放器对于初学者来说是十分有用的,它包含了使用 DirectShow 播放视频所有必备的函数. 直接贴上代码,具体代码的含义都写在注释中 ...

  5. HTML:给自己设计一个简单的专属网页音乐播放器

    Hello,大家好,我是wangzirui32,今天我们来学习如何给自己设计一个简单的网页音乐播放器. 开始学习吧! 学习目录 1. 项目架构 2. player.html 编写 3. style.c ...

  6. 基于 DirectShow 的播放器

    https://blog.csdn.net/leixiaohua1020/article/details/13019147 COM编程之 QueryInterface https://www.cnbl ...

  7. 最简单的基于DirectShow的示例:视频播放器自定义版

    ===================================================== 最简单的基于DirectShow的示例文章列表: 最简单的基于DirectShow的示例:视 ...

  8. 最简单的基于DirectShow的示例:视频播放器图形界面版

    ===================================================== 最简单的基于DirectShow的示例文章列表: 最简单的基于DirectShow的示例:视 ...

  9. 最简单的基于DirectShow的示例:视频播放器

    ===================================================== 最简单的基于DirectShow的示例文章列表: 最简单的基于DirectShow的示例:视 ...

最新文章

  1. vue 公用页面引用_vue中实现部分页面引入公共组件
  2. servlet生命周期
  3. DeepID2——强大的人脸分类算法
  4. boost::intrusive::function_hook用法的测试程序
  5. 从数据结构角度分析foreach效率比for循环高的原因
  6. 数据库流行度11月排行榜:Oracle 意外滑落和 PostgreSQL 再创新高
  7. [leetcode]5337. 每个元音包含偶数次的最长子字符串
  8. Java 常用类 -Math
  9. 数码媒体前股东向华视传媒提告状讼
  10. wpf程序网络的影响_DotNetCore Web应用程序中的Cookie管理
  11. 江西省建设工程安全质量监督管理局全省工程安全质量信息数据维护升级存储及异地备份项目中标公告...
  12. Linux内核中的IPSEC实现(6)
  13. mysql使用存储过程循环修改数据
  14. 数组的数据查找c语言,【查找数组面试题】面试问题:c语言实现数据… - 看准网...
  15. python调用mt4_python mt4
  16. lombok依赖包介绍
  17. Unity 3D 特效学习记录
  18. 惠普局域网共享打印机设置_惠普打印机局域网共享
  19. linux清除所有后台程序,Linux查看和关闭后台运行程序的方法
  20. Infor与云的不解之缘

热门文章

  1. 诺基亚E63常见设置指南
  2. HDU2026 首字母变大写【文本处理】
  3. ZOJ1003 Crashing Balloon【水题】
  4. JSK-388 等差数列【入门】
  5. CCF NOI1145 数字金字塔【DP】
  6. I00027 Java语言程序-打印九九乘法表
  7. 写作的积累 —— 台词
  8. Matlab Tricks(十八)—— 矩阵间元素距离的计算
  9. 链表的应用 —— 多项式运算(加法+乘法)
  10. seo代码优化工具_谁是「南京SEO」搜索引擎网站关键词排名优化专家