当前位置:编程学习 > C/C++ >>

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

首先来看看CSimplePlayerDlg这个类的定义,瞧瞧SimplePlayerDlg.h这个头文件。
[cpp] 
/* 雷霄骅 
 * 中国传媒大学/数字电视技术 
 * 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 FindFilterByInte易做图ce(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控件对应的类。需要注意一下,有一个变量:
[cpp] 
CDXGraph *   mFilterGraph  
接下来看看CSimplePlayerDlg函数的实现部分吧。
OnButtonOpen():打开媒体文件按钮的响应函数
[cpp]  
//打开  
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()函数如下所示:
 
[cpp]  
//创建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()
[cpp] 
//(如果有)销毁Graph  
void CSimplePlayerDlg::DestroyGraph(void)  
补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,