为什么在XP上显示DirectShow窗口(但不是Vista或Windows 7)需要WS_CLIPCHILDREN?

Mid*_*are 3 windows directshow

我写了一个在窗口上播放MPEG视频的程序(当然,DirectShow将打开它自己的窗口作为该窗口的子窗口).在Windows Vista和7上,该程序工作正常.但是在XP上,视频只有在我WS_CLIPCHILDREN在外窗口设置样式时才可见(即不是DirectShow样式).这是XP中的错误还是Vista中的某些模型更改?

Sho*_*og9 6

实际上,这听起来像是代码中的错误......

WS_CLIPCHILDREN影响父窗口的绘制.更具体地说,它可以防止它在其子女所占据的区域中绘制.因此,如果您定期重新绘制父级并且设置WS_CLIPCHILDREN,最终会在子窗口的显示上踩踏...

至于为什么这可能影响XP而不是Vista或Win7,那么......这只是一个猜测,但XP上的许多视频播放器使用了大多数视频卡提供的功能,称为" 覆盖 ":基本上,窗口充满了一个关键颜色,然后由硬件识别,表示屏幕上将显示视频的区域.由于窗口本身不会经常重新绘制(它最初需要填充关键颜色,并且在调整大小时,但不会重新绘制视频中的每一帧),允许父级绘制它可能会严重搞乱你的输出!

潜在解决方案

  1. 在父窗口中使用WS_CLIPCHILDREN.无论如何,这几乎总是一个好主意.

  2. 如果您的父窗口具有自定义绘制代码,请将其修改为手动避免绘制子窗口所占的区域.