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

王朝vc·作者佚名  2006-01-09
宽屏版  字体: |||超大  

在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);

上述方法的实现如下:

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
© 2005- 王朝网络 版权所有