【问题标题】:How to control the painting of the player如何控制播放器的绘画
【发布时间】:2026-01-21 22:30:01
【问题描述】:

我正在尝试在实时视频上画一些东西。在我看来,最好的方法是处理 WM_PIANT 事件。

我的目的是让玩家先绘制,然后再绘制应用程序。这样我就可以在视频上画画了。 这意味着每次我们需要在窗口上绘制新框架然后处理事件之前,我都希望得到通知。

我使用 DirectshowNet,所以我使用 C# 编程(我拥有 c++ 的 API 的所有接口 拥有)。我了解图形管理器会将某些窗口消息转发给视频渲染器,例如 WM_PAINT。

如何使播放器在应用程序之前而不是之后绘制帧?

【问题讨论】:

    标签: c# c++ directshow repaint wm-paint


    【解决方案1】:

    WM_PAINT不是最好的方式,而且是错误的方式。

    查看 DirectShow.NET 库中的 DxText 示例。它的描述是:

    一个示例应用程序,展示了如何将文本字符串叠加到 数据流。流是从 avi 文件中读取的。

    这与您想要达到的目标非常接近。另一种方法显示在另一个示例中,BitmapMixer

    BitmapMixer 是一个示例,说明如何使用 VMR9。

    本示例主要围绕 IVMRMixerBitmap9 接口构建。 此接口接受位图作为 GDI 设备上下文或 Direct3D 表面。 Direct3D Surface 的主要优点是它 启用真正的 Alpha 透明度。 GDI DC 不支持 alpha 位图和透明度是通过使用颜色键控来实现的。

    此示例使用 GDI+ 动态生成位图。

    【讨论】:

    • 我尝试了 BitmapMixer,但它对我不起作用,因为我使用 Graphic 对象在播放器上绘图,我在窗口上有一个真正透明的面板,我创建了该面板的图形和然后我将图形对象的 hdc 与 bitmapMixer 一起使用,然后我不能再在图形上绘图,因为从现在开始,图形对象正在与其他人一起使用。现在我需要能够在播放器上动态地绘制一些东西,这意味着我将在播放器上绘制不同的东西并且它们会留在那里。你还有别的想法吗?谢谢你的帮助。
    • DShow 播放永远不会透明。也就是说,您需要查看有关如何将帧从那里获取到Graphic 对象的示例,并且实际上并不可视化视频。相反,您将使用单独的框架并在 DShow 之外按照您需要的方式绘制它们。
    • 不,这不是我想要做的,我使用的是透明的 panel 它是一个 contol 对象,我将其设为透明,我不希望播放器是透明的。