1

我有一个 activeX 控件,其中包含一个窗口,该窗口具有正在绘制的流式视频。我有一个单独的对话框,我在另一个窗口中创建了一个单独的对话框,我以各种方式将其设置为透明或半透明(即使用 SetLayeredWindowAttributes(...) 以及对话框的 Layered 属性 [用于 alpha 混合] 或设置透明财产)。

此外,我尝试使用各种方法来尝试让对话框的窗口始终绘制在流视频窗口的顶部,但没有一种方法对我有用。如果我在对话框上有一个按钮或使用 LineTo(...) 调用在透明表面上绘图,它们不会保留在视频顶部。我尝试使用 SetWindowPos 来影响两个窗口的 z 顺序,并尝试更改对话框窗口属性,例如“TopMost”,但无济于事。

有没有人试图为流视频上的覆盖窗口做这样的事情,并让 z 顺序在流视频之后始终绘制前窗口?

更新:02/10/10 - 尝试使用 WS_EX_LAYERED 属性和 SetLayeredWindowAttributes(...) 使用 LWA_COLORKEY 并实现了我想要的。由于分层属性不能与 WS_CHILD 样式一起使用,因此该解决方案带来了一些必要的覆盖窗口位置管理,该位置相对于带有视频的窗口。此外,我还试图消除其他一些奇怪的东西。例如,当带有视频的 activeX 控件窗口嵌入到 IE 选项卡中并且我切换到另一个选项卡时,覆盖窗口上的控件仍保留在新选项卡的顶部(使用 WS_POPUP 样式时)。仍在研究是否会有其他方法来处理这个问题,然后确定开关和隐藏窗口可见性。

4

2 回答 2

0

这可能是不可能的,很多视频输出代码都使用硬件覆盖,所以如果你的窗口在前面,覆盖要么不起作用,要么根本不会绘制像素所在的位置。

硬件覆盖允许视频绘制代码以不同于当前显示格式的格式呈现帧,这样可以节省大量的 CPU 和内存带宽。

根据我的经验,覆盖通常是 YUV 格式而不是 RGB,因为许多视频压缩格式都是基于 YUV。因此,视频硬件从 YUV 图像而不是从屏幕缓冲区获取一些像素,因此除非您将自己插入到视频流的渲染代码路径中,否则您无法影响这些像素。

于 2010-02-01T21:21:36.703 回答
0

WS_EX_LAYERED 属性和 SetLayeredWindowAttributes(...) 使用 LWA_COLORKEY 将在使用颜色键的地方实现透明度。透明覆盖保持在视频前面,活动流视频保持直播。WS_CHILD 样式不能与分层样式一起使用,因此如果使用 WS_POPUP,则需要额外管理窗口位置。由于无法将覆盖作为子窗口,可能会出现其他问题。- 见 Q 更新。

于 2010-02-11T22:37:13.373 回答