游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2038|回复: 0

自己的窗口或MFC播放dshow时注意

[复制链接]

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
发表于 2007-3-10 23:09:00 | 显示全部楼层 |阅读模式
用自己的窗口,或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键截过视频吧!
截下来的图象,粘贴到画图中去,居然还可以播放(只要不关播放器)!?
但如果在截图中画上几笔,被涂鸦的区域就不能播放了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-26 16:56

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表