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

类别:VC语言 点击:0 评论:0 推荐:

在CPlayWndDlg的构造函数中添加初始化代码

CPlayWndDlg::CPlayWndDlg(CWnd* pParent /*=NULL*/)

    : CDialog(CPlayWndDlg::IDD, pParent)

{

    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

 

    m_pGraph      = NULL;

    m_pMediaControl = NULL;

    m_pEvent      = NULL;

    m_pMediaSeeking = NULL;

 

    m_strMediaFile = "";

    m_isPlaying = FALSE;

}

 

由于一些和窗体控制有关的初始化代码不能放在构造函数中进行,我们将其放在CPlayWndDlg::OnInitDialog()中,我们必须在此必须对CPlayWndDlg添加WS_CLIPCHILDREN 的Style,因为在我们的应用中把视频窗体作为CPlayWndDlg的一个子窗体来使用的,这是非常重要的,许多开发人员在刚开始使用DirectShow时,父窗体的Style没有设置正确,造成视频不能正确显示,代码如下:

    // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动

    //  执行此操作

    SetIcon(m_hIcon, TRUE);         // 设置大图标

    SetIcon(m_hIcon, FALSE);        // 设置小图标

 

    // TODO: 在此添加额外的初始化代码

    ModifyStyle(0, WS_CLIPCHILDREN);

    ((CEdit*)GetDlgItem(IDC_MEDIAFILE_EDIT))->SetReadOnly(TRUE);  

    return TRUE;  // 除非设置了控件的焦点,否则返回 TRUE

}

       添加相应的清除代码,重载CPlayWndDlg的DestoryWindow方法,如下:

BOOL CPlayWndDlg::DestroyWindow()

{

    // TODO: 在此添加专用代码和/或调用基类

    if(m_pGraph)

       m_pGraph->Release();

    if(m_pMediaControl)

       m_pMediaControl->Release();

    if(m_pEvent)

       m_pEvent->Release();

    if(m_pMediaSeeking)

       m_pMediaSeeking->Release();

 

    m_pGraph = NULL;

    m_pMediaControl = NULL;

    m_pEvent = NULL;

    m_pMediaSeeking = NULL;

    return CDialog::DestroyWindow();

}

7.修改CPlayWndDlg::OnPaint(),由于现在视频显示区域必须由我们自己进行重画:

void CPlayWndDlg::OnPaint()

{

    if (IsIconic())

    {

        CPaintDC dc(this); // 用于绘制的设备上下文

 

        SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

 

        // 使图标在工作矩形中居中

        int cxIcon = GetSystemMetrics(SM_CXICON);

        int cyIcon = GetSystemMetrics(SM_CYICON);

        CRect rect;

        GetClientRect(&rect);

        int x = (rect.Width() - cxIcon + 1) / 2;

        int y = (rect.Height() - cyIcon + 1) / 2;

 

        // 绘制图标

        dc.DrawIcon(x, y, m_hIcon);

    }

    else

    {

       if(m_isPlaying == FALSE)

       {

           CClientDC dc(GetDlgItem(IDC_VW_FRAME));

           dc.SetBkColor(RGB(0,0,0));

 

           CRect rc; 

           GetDlgItem(IDC_VW_FRAME)->GetClientRect(rc);

           //ClientToScreen(rc);

           dc.FillRect(rc, CBrush::FromHandle((HBRUSH)GetStockObject(BLACK_BRUSH)));

           GetDlgItem(IDC_VW_FRAME)->Invalidate();

       }

 

        CDialog::OnPaint();

    }

}

添加浏览、播放、暂停、关闭四按钮的相应事件响应函数,同时在CPlayWndDlg中添加如下四个私有方法:

    void MoveVideoWindow(void);

    void CleanUp(void);

    BOOL Stop(void);

    BOOL Play(void);

上述方法的实现如下:

 

本文地址:http://com.8s8s.com/it/it1021.htm