|
|
用自己的窗口,或MFC播放时的一个“诡异”bug.现在已解决,奉献给大家:
(*不是所有的机器都会出现此问题*)
环境:
MFC对话框程序。
对话框。
对话框上有菜单。
对话框上有Static控件。属性Rectangle,黑色。
IVideoWindow是Static的子窗口。
(*注意:Static是对话框的子窗口,而IVideoWindow是Static的子窗口,不要混淆*)
现象:
播放视频时没有图象。
拖动对话框时就有图象。
使用菜单之后,留下黑色区域。
重新调整对话框大小后,没有图象。
。。。调试。。。
解决方法:
>解决图象显示:
在OnInitDialog中:
CStatic *tmp=(CStatic*)GetDlgItem(IDC_PIC1);
if(tmp)
{
::SetWindowLong(tmp->m_hWnd,GWL_STYLE,tmp->GetStyle()|WS_CLIPCHILDREN|WS_CLIPSIBLINGS);
}
>解决菜单:
为对话框设置属性:clip children 和 clip sibling即可。
>>结论<<
>当Static重绘时,没有图象,因为Static会绘制一个矩形把IVideoWindow盖住。
>当对话框受到WM_PAINT消息时,IVideoWindow不会重绘。也取得不了其hwnd(惨。
>IVideoWindow在移动时(它当然是和我们的对话框一起移动拉),它自己就会重绘,我们便看到图象。
>使用菜单之后,留下黑色区域,是因为重绘了Static的相应区域。
>由于不能控制IVideoWindow重绘,只能不重绘他的父窗口(Static控件)
>放心,当别的窗口掠过IVideoWindow,或IVideoWindow移动时,他自己会重绘的。
>视频图象显示的条件:
IVideoWindow可见。
只要在IVideoWindow的区域内没有其他窗口重绘,即使IVideoWindow不重绘,视频也能显示。
换言之,虽然视频图象在不断播放,但对于WindowGDI来说,IVideoWindow并没有重绘!!
>我们可以这么理解:对于GDI来说,IVideoWindow就是一个特殊的黑色区域(注意不是普通的黑色!)
dshow把视频图象在特殊的黑色区域内显示,注意,只在黑色区域内显示,
就是说,如果在特殊的黑色区域的位置上进行GDI绘图(比如其他窗口重绘),就会覆盖掉一部分视频。
而且,播放视频时,IVideoWindow也不会重绘这个区域。
(实际上并不是这样,而是DC的原因,不过可以简单这么理解,MS搞的东西真晕那~)
**大家都用PrintScreen键截过视频吧!
截下来的图象,粘贴到画图中去,居然还可以播放(只要不关播放器)!?
但如果在截图中画上几笔,被涂鸦的区域就不能播放了 |
|