笔记--VC+DShow+TS(from network) --视频区域刷新问题

问题:

 

在主窗体中某一区域新增一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);

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值