在中Visual Studio .NET 2003利用DirectShow播放媒体文件(五)

原创 2004年04月12日 12:55:00

浏览、播放、暂停、关闭四按钮的相应事件响应函数如下:

void CPlayWndDlg::OnBnClickedBrowseButton()<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

{

    CFileDialog dlgFile(TRUE, NULL, NULL,

       OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,

       "Movie Files (*.avi;*.mpg;*.mpeg) |/

       *.avi;*.mpg;*.mpeg |/

       Audio Files (*.wav;*mp3;*.mpa;*.mpu;*.au) |/

       *.wav;*.mp3;*.mpa;*.mpu;*.au |/

       <?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />Midi Files (*.mid;*.midi;*.rmi) |/

       *.mid;*.midi;*.rmi| | ", this);

 

    if(dlgFile.DoModal() == IDOK)

    {

       m_strMediaFile  = dlgFile.GetPathName();

       GetDlgItem(IDC_MEDIAFILE_EDIT)->SetWindowText(m_strMediaFile);

    }

    else

       return;

 

    CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC, IID_IGraphBuilder, (void **)&m_pGraph);

    HRESULT hr = m_pGraph->RenderFile(CA2W(m_strMediaFile), NULL);

    if(FAILED(hr))

    {

       char szMsg[200];

       AMGetErrorText(hr, szMsg, sizeof(szMsg));

       AfxMessageBox(szMsg);

    }

 

    //指定父窗体

    IVideoWindow* pVidWin = NULL;

    m_pGraph->QueryInterface(IID_IVideoWindow, (void **)&pVidWin);

    pVidWin->put_Owner((OAHWND)m_hWnd);

    pVidWin->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN);

 

    CRect rc;

    GetDlgItem(IDC_VW_FRAME)->GetWindowRect(rc);

    ScreenToClient(rc);

    pVidWin->SetWindowPosition(rc.left, rc.top, rc.Width(), rc.Height());

 

    // 注意此处Filter Graph Manager的事件以WM_GRAPHNOTIFY发出(用户定义的消息).

    m_pGraph->QueryInterface(IID_IMediaEventEx, (void **)&m_pEvent);

    m_pEvent->SetNotifyWindow((OAHWND)m_hWnd, WM_GRAPHNOTIFY, 0);

 

    // 设置Seeking

    m_pGraph->QueryInterface(IID_IMediaSeeking, (void **)&m_pMediaSeeking);

 

}

 

void CPlayWndDlg::OnBnClickedPlayButton()

{

    Play();

}

 

void CPlayWndDlg::OnBnClickedPauseButton()

{

    m_pMediaControl->Pause();

 

    m_isPlaying = TRUE;

    GetDlgItem(IDC_PLAY_BUTTON)->EnableWindow(TRUE);

    GetDlgItem(IDC_PAUSE_BUTTON)->EnableWindow(FALSE);

}

 

void CPlayWndDlg::OnBnClickedCancel()

{

    // TODO: 在此添加控件通知处理程序代码

    CleanUp();

    OnCancel();

}

8.添加对WM_GRAPHNOTIFY消息,及其响应函数

PlayWndDlg添加消息ID定义:

#define WM_GRAPHNOTIFY WM_USER + 101

PlayWndDlg.h中,代码如下:

// 实现

protected:

    HICON m_hIcon;

 

    // 生成的消息映射函数

    virtual BOOL OnInitDialog();

    afx_msg void OnSysCommand(UINT nID, LPARAM lParam);

    afx_msg void OnPaint();

    afx_msg HCURSOR OnQueryDragIcon();

    DECLARE_MESSAGE_MAP()

    afx_msg HRESULT OnGraphNotify(WPARAM wParam,LPARAM lParam);

private:

    IGraphBuilder *m_pGraph;

    IMediaControl *m_pMediaControl;

    IMediaEventEx *m_pEvent;

PlayWndDlg.cpp,如下:

    ON_BN_CLICKED(IDC_BROWSE_BUTTON, OnBnClickedBrowseButton)

    ON_BN_CLICKED(IDC_PLAY_BUTTON, OnBnClickedPlayButton)

    ON_BN_CLICKED(IDC_PAUSE_BUTTON, OnBnClickedPauseButton)

    ON_BN_CLICKED(IDCANCEL, OnBnClickedCancel)

    ON_MESSAGE(WM_GRAPHNOTIFY, OnGraphNotify)

END_MESSAGE_MAP()

 

实现如下:

HRESULT CPlayWndDlg::OnGraphNotify(WPARAM wParam,LPARAM lParam)

{

    long levCode, lparam1, lparam2;

    HRESULT hr;

    while (hr = m_pEvent->GetEvent(&levCode, &lparam1, &lparam2, 0), SUCCEEDED(hr))

    {

        hr = m_pEvent->FreeEventParams(levCode, lparam1, lparam2);

        if ((EC_COMPLETE == levCode) || (EC_USERABORT == levCode))

        {

            TRACE("End of the media file!!./n");

            Stop();

            //CleanUp();

            break;

        }

    }

 

    return hr;

}

 有需要者可以与我索取源码

Visual Studio .NET 2003开发环境

昨天到今天搞了一整天,把人都要差点搞崩了! ,以后再也不能乱关机了,因为这次的大意,几乎所有的Net安装,调试问题都被我碰到了,还好,我一个个把他记录下来了,同时,在CSDN找了一些相关的解决方法,不...
  • msdnlu
  • msdnlu
  • 2007年07月12日 09:17
  • 1169

Visual Studio 各版本区别及下载

Visual Studio 各版本区别: 从1998年的 6.0 到现在的 2010 Ultimate 如何注册和获得以及购买许可 VS101 2010-07-08 04:33:59 阅读1072 ...
  • wisage
  • wisage
  • 2011年05月31日 09:28
  • 4369

在中Visual Studio .NET 2003利用DirectShow播放媒体文件(四)

// IDC_VW_FRAME控件Picture Control主要作用是控制Vedio Window的显示位置void CPlayWndDlg::MoveVideoWindow(void){    ...
  • sunjin007
  • sunjin007
  • 2004年04月12日 12:55
  • 987

在中Visual Studio .NET 2003利用DirectShow播放媒体文件(一)

 DirectShow是微软公司提供的一套在Windows平台上进行流媒体处理的开发包,与DirectX开发包一起发布。DirectShow为多媒体的捕捉和回放提供了强有力的支持。运用DirectSh...
  • sunjin007
  • sunjin007
  • 2004年04月12日 12:28
  • 1808

在中Visual Studio .NET 2003利用DirectShow播放媒体文件(三)

在CPlayWndDlg的构造函数中添加初始化代码CPlayWndDlg::CPlayWndDlg(CWnd* pParent /*=NULL*/)    : CDialog(CPlayWndDlg:...
  • sunjin007
  • sunjin007
  • 2004年04月12日 12:28
  • 854

在中Visual Studio .NET 2003利用DirectShow播放媒体文件(二)

3.设置工程属性    项目→PlayWnd属性→配置属性→链接器→输入→附加依赖项,添加库文件Strmiids.lib 和Quartz.lib。由于Dshow.h头文件是在任何DirectShow工...
  • sunjin007
  • sunjin007
  • 2004年04月12日 12:28
  • 808

VisualStudio.NET2003下载地址

VisualStudio.NET2003,它是Microsoft的第二代开发工具,用于构建和部署功能强大而安全的连接Microsoft.NET的软件。 下载地址中有Visual Studio ....
  • vbLittleBoy
  • vbLittleBoy
  • 2014年08月23日 11:46
  • 5650

Visual Studio .Net 2003 的安装

Q:安装Visual Studio .Net 2003,结果出现提示:“安装程序检测到另一个程序要求计算机重新启动.必须重新启动计算机后才能安装visual studio.net系统必备.系统重新启动...
  • Elysium
  • Elysium
  • 2006年09月01日 13:15
  • 9647

VisualStudio2003 下载地址

VisualStudio2003  下载地址http://www.ivdown.com/ShowContent.aspx?id=1546&pid=4&cid=36 msdn2003帮助文件下载地址 ...
  • xqf222
  • xqf222
  • 2006年09月25日 21:21
  • 2053

MSDN Library Visual Studio .NET 2003 简体中文版(ISO) 免费下载

       MSDN Library Visual Studio .NET 2003 简体中文版(ISO)  CD1      MSDN Library Visual Studio .NET 200...
  • ddl007
  • ddl007
  • 2006年04月09日 21:58
  • 9289
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在中Visual Studio .NET 2003利用DirectShow播放媒体文件(五)
举报原因:
原因补充:

(最多只允许输入30个字)