问题:
在主窗体中某一区域新增一Picture控件,用以显示影像。可是开始时总是只有声音没有影像,移动两下后才会出现影像。
解决:
参考网络大虾们的建议,得知是由于刷新问题引起的,摘自rageliu的博客:
“其实这是由于视频窗口没有消息循环不能实时刷新造成的,出现这样的情况基本都是在调用了IVideoWindow接口的put_Owner()方法将视频窗口设置为了其他窗口的子窗口后出现的。
一般解决办法是将视频窗口设置为主窗体的子窗体,借助主窗体的WM_PAINT消息在OnPaint()里面实现刷新。再有就是在结束时的善后工作一定要做好!!一般是:
pivw->put_Visible(OAFALSE);
pivw->put_Owner(NULL);
pivw是IVideoWindow接口指针
附带说一下如果是要接收视频窗口的消息,比如全屏下的ESC,就用
pivw->put_MessageDrain((OAHWND)m_mainHwnd);//m_mainHwnd是接收消息的窗体的句柄”
我是直接使用陆老师的CDXGraph类来做的,他的SetDisplayWindow(),
在主程序的CreateGraph中可以如下调用
mGraph.SetDisplayWindow(m_VideoWindow.GetSafeHwnd());
mGraph.SetNotifyWindow(this->GetSafeHwnd());
其中,m_VideoWindow就是那picture控件,属性设置:type选择frame。具体操作为:
.h中定义:
CStatic m_VideoWindow;
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
在cpp中:
void CTestVODDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_STATIC_VIDEO, m_VideoWindow);
}
BEGIN_MESSAGE_MAP(CTestVODDlg, CDialog)
ON_WM_ERASEBKGND()//新增这个
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
BOOL CTestVODDlg::OnEraseBkgnd(CDC* pDC)
{
CRect rc;
m_VideoWindow.GetWindowRect(&rc);
ScreenToClient(&rc);
pDC->ExcludeClipRect(&rc);
return CDialog::OnEraseBkgnd(pDC);
}
这样做的话,有个不恰当的地方,就是启动时picture控件处显示位于它下方的界面,这是由于选择frame的缘故,边框(内里是透明的)。
继续找更好的解决方法。。。。。
又找到个别人的解决方法:::
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
经常有刚接触的朋友问关于这类的问题,什么图象不刷新,拖动一下窗口就出来了呀等,在此我将相关处理方法写一下。
假设图象窗口的picture控件id为idc_frame_view,
pviewwindon 为 ivideowindow*接口,作四步处理
1、修改显示控件属性
cwnd* pwnd = getdlgitem(idc_frame_view);
pwnd->modifystyle(0, ws_clipchildren);
2、设置为子窗口的句柄
cwnd* pwnd = getdlgitem(idc_frame_view);
put_owner((oahwnd)pwnd->getsafehwnd( ))
3、onpaint 不用动
4、onerasebkgnd 加如下代码
rect rect;
cwnd* pwnd = getdlgitem(idc_frame_view);
pwnd->getwindowrect(&rect);
screentoclient(&rect);
pdc-> excludecliprect(&rect);
return cdialog::onerasebkgnd(pdc);经常有刚接触的朋友问关于这类的问题,什么图象不刷新,拖动一下窗口就出来了呀等,在此我将相关处理方法写一下。
假设图象窗口的picture控件id为idc_frame_view,
pviewwindon 为 ivideowindow*接口,作四步处理
1、修改显示控件属性
cwnd* pwnd = getdlgitem(idc_frame_view);
pwnd->modifystyle(0, ws_clipchildren);
2、设置为子窗口的句柄
cwnd* pwnd = getdlgitem(idc_frame_view);
put_owner((oahwnd)pwnd->getsafehwnd( ))
3、onpaint 不用动
4、onerasebkgnd 加如下代码
rect rect;
cwnd* pwnd = getdlgitem(idc_frame_view);
pwnd->getwindowrect(&rect);
screentoclient(&rect);
pdc-> excludecliprect(&rect);
return cdialog::onerasebkgnd(pdc);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~