問題:
在主窗體中某一區域新增一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);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~