【问题标题】:Drawing problem does ShowWindow(hWnd, SW_HIDE) automatically invalidate rectangles?绘图问题 ShowWindow(hWnd, SW_HIDE) 会自动使矩形无效吗?
【发布时间】:2010-04-14 18:16:29
【问题描述】:

我遇到了一个问题,我有一个包含子窗口的窗口。子窗口包含另一个使用 Windows Media Player 播放视频的子窗口。每当我在父窗口上调用 ShowWindow (hWnd, SW_HIDE) 并在整个表面上绘画时,孙子窗口(播放视频的位置)占据的区域不会被覆盖。我使用了 spy++,发现在重绘发生之前,未被覆盖的区域被设置为隐藏。

我监视了子窗口的 hwnd,它似乎没有收到任何 WM_EraseBKGND 或 WM_NCPAINT 消息。这是否意味着它所占据的区域没有被无效,因此不能被绘制?我是winforms的新手。

谢谢!

【问题讨论】:

  • 视频窗口可能使用了 DirectX 等技术,它绕过通常的 Windows API 进行屏幕更新。不幸的是,我不知道如何为您提供帮助 - 我希望子窗口能够检测到它被隐藏并自动禁用孙子窗口。
  • 经过一番调查,我认为 DirectX 是问题所在,我关闭了桌面合成(我使用的是 Vista),并且没有出现此问题。此外,如果我在播放视频时隐藏窗口(而不是停止和隐藏),问题也不会发生。
  • 问题似乎出在 Vista 的 EVR 视频渲染器上,如果正在渲染的视频停止,它所占据的区域似乎没有被绘制。

标签: winforms mfc hwnd


【解决方案1】:

非常不清楚,我必须假设当您隐藏父窗口时,什么都不会可见。可能相关的一件事是视频始终显示在硬件覆盖中。这是视频适配器的一个功能,它可以覆盖不同的视频内存块以生成合成图像。因此,如果您隐藏该视频窗口,该窗口的父窗口将不会收到重绘消息,因为它实际上并没有重叠。

使用 Invalidate() 方法强制窗口重新绘制自己。如果可以,请避免使用 P/Invoking ShowWindow(),Visible 属性始终是一个不错的选择。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-12
    • 1970-01-01
    • 1970-01-01
    • 2011-11-23
    • 2019-09-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多