`

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

 
阅读更多

上篇文章分析了一个封装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

 

 

分享到:
评论

相关推荐

    基于MFC的DirectShow开发

    它提供了丰富的控件和对话框类,使得开发者可以轻松创建出用户友好的界面。在这个视频采集程序中,可能使用了`CDialog`类来创建对话框,并且通过自定义消息处理函数来接收和响应DirectShow的数据流,例如在视频帧...

    基于MFC的简易音乐播放器

    本实验旨在设计一个基于MFC的简易Windows音乐播放器。该播放器的目标是在Windows XP平台上使用Visual C++进行开发,并确保其能在Windows 2000/XP等操作系统上运行。通过这个项目,不仅可以学习MFC的基本使用方法,还...

    vc++基于MFC实现多媒体播放器源码

    在本项目中,我们探讨的是如何使用VC++和MFC(Microsoft Foundation Classes)框架来构建一个多媒体播放器。MFC是微软提供的一套C++类库,它为开发者提供了构建Windows应用程序的便捷途径,尤其适合桌面应用开发。...

    MFC基于对话框编辑的视屏播放器

    本项目“MFC基于对话框编辑的视频播放器”是一个使用MFC库构建的简单应用,主要功能是在一个对话框界面中播放AVI格式的视频。 1. **MFC对话框应用**: MFC中的对话框类(`CDialog`)用于创建和管理窗口对话框。在...

    VS2013基于MFC制作的音乐播放器

    在MFC中,我们通常会创建一个对话框类(CDialog-derived class),这个类将包含音乐播放器的所有控件,如按钮、滑块等。例如,我们可以创建一个`CPlayControlButton`类继承自`CButton`,并重写其消息映射函数以响应...

    基于VC和Directshow 播放avi视频

    例如,`Exa1Dlg.cpp`是对话框类的实现,负责与用户交互,提供播放、暂停、停止等控制按钮。`VedioData.cpp`和`DibData.cpp`可能包含了处理视频数据和显示的函数,比如视频帧的解码和位图数据的处理。`MyFileDialog....

    基于vc的 KTV播放器

    从文件名列表来看,例如`ZWKTVDLG.cpp`可能包含了主程序的对话框类,`GUANLIDLG.cpp`可能是管理员管理界面,`ZHANGDANDLG.cpp`可能是用户账户相关的界面。开发者需要熟练使用MFC(Microsoft Foundation Classes)库...

    MFC简单音乐播放器

    【MFC简单音乐播放器】是一款基于MFC(Microsoft Foundation Classes)框架开发的简易音乐播放软件,主要用于学习和实践MFC编程技术。本项目旨在帮助开发者了解如何利用MFC库来构建用户界面,并实现基本的音频播放...

    VC++编写的视频播放器,基于MFC

    **VC++编写的视频播放器基于MFC** 在软件开发领域,Visual C++(简称VC++)是一款...通过分析和理解这些文件,开发者可以学习到如何使用VC++和MFC构建一个简单的视频播放器,以及如何集成多媒体库来实现视频播放功能。

    VC++迷你播放器 迷你播放器

    本项目是一个基于VC++编写的迷你播放器,旨在提供一个简单易用、界面友好的多媒体播放平台,对于那些热衷于VC++编程和多媒体技术学习的人来说,是一个很好的参考资料。 首先,VC++是Microsoft开发的集成开发环境...

    VC++音乐播放器(毕业设计论文)

    【VC++音乐播放器(毕业设计论文)】项目是一个基于Visual Studio 2010编译环境的音乐播放软件开发实例。此项目旨在提供一个简易的用户界面,让用户能够方便地管理和播放音乐文件。以下是对这个项目的详细知识点解析...

    阿浪MP3音乐播放器

    总的来说,"阿浪MP3音乐播放器"是一个基于MFC的初级项目,它涵盖了音频解码、播放控制、界面设计等多个方面,对于想要学习MFC和Windows音频编程的初学者来说,是一个不错的起点。通过分析和学习这个项目,开发者可以...

    MFC简单视频播放器

    2. **添加媒体播放控件**:在资源编辑器中插入ActiveX控件,并在对话框类中声明和初始化它。 3. **消息映射与处理**:定义消息映射函数,处理用户输入和控件事件。 4. **文件选择和加载**:添加打开文件对话框,...

    自制MFC音乐播放器

    在这个项目中,开发者可能创建了一个对话框类,用于显示播放器的控制按钮,如播放、暂停、停止、上一曲、下一曲等。 描述中提到“菜鸟”,意味着这个项目可能是作者学习MFC的初步尝试。在这样的项目中,开发者通常...

    MFC编程音乐播放器

    1. **对话框(Dialog)**:MFC中的对话框类(CDialog)是用户界面的基础,用于显示音乐播放器的控制面板。这通常包含按钮(CButton)用于播放、暂停、停止等操作,滑块(CSliderCtrl)用于音量控制,进度条...

    MFC对话框做的播放器

    这将在Visual Studio中自动生成基本的项目结构,包括一个对话框类(通常是CDlg或CPlayerDlg)和相应的资源文件。 接下来,我们需要添加必要的控件到对话框上。这通常包括播放、暂停、停止、前进和后退按钮,以及一...

    MFC音乐播放器

    这个“MFC音乐播放器”项目是基于Visual C++的一个实践应用,它展示了如何利用MFC框架来创建一个功能简单的音乐播放器。在这个项目中,我们将深入探讨MFC的基本原理,以及如何将其应用于多媒体播放器的开发。 1. **...

    音乐播放器源码

    4. **用户界面**:`实用播放器Dlg.h`和`实用播放器Dlg.cpp`文件是关于对话框类的,对话框是Windows程序中常见的用户交互界面。它们包含了音乐播放器的界面元素,如播放、暂停、停止等按钮,以及音量控制和歌曲进度条...

    VC的简单AVI播放器

    在IT领域,开发一个视频播放器是常见的任务之一,尤其对于初学者来说,这是一个很好的学习项目。本项目“VC的简单AVI播放器”就是基于Visual C++6.0实现的,它允许用户播放AVI格式的视频文件。在这个项目中,我们...

Global site tag (gtag.js) - Google Analytics