筆記--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);

 

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章