在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