代码之家  ›  专栏  ›  技术社区  ›  Stefan

OpenGL窗口已清除,没有WM_绘制消息

  •  1
  • Stefan  · 技术社区  · 16 年前

    我有一个带有三个MDI窗口的应用程序,它们都显示OpenGL内容。在XP上,一切正常。但是在Vista/Win7上,mdi子窗口不能正常刷新。

    启动后,所有窗口都会正确显示其内容。但是,当我将焦点从一个mdi窗口切换到下一个mdi窗口时,这两个窗口将被清除(即,它们只显示白色,没有内容)。我不知道为什么这些窗口会被清除,在这种情况下,它们不会收到任何WM_*消息,当然也不会收到WM_*绘画消息。

    在调整这些窗口的大小时,我正确地获得了WM_PAINT消息(在WM_大小之后)并重新绘制了内容,但随后窗口也被清除,这导致在调整大小时出现奇怪的闪烁。停止调整大小后,窗口将保持清除状态(白色),直到我手动强制刷新。

    这与启用或禁用Aero无关。

    1 回复  |  直到 16 年前
        1
  •  3
  •   meklarian    16 年前

    我很惊讶它能在XP上运行。在我(有限的)接触OpenGL的经验中,WM_PAINT并不总是重新绘制OpenGL场景的最佳场所。内容很可能在驱动程序级别被删除。您可以通过查看其中一个MDI窗口跨越连接到两个不同视频卡的两个监视器时发生的情况来检查这一点。

    请尝试以下操作:

    1. 在WM_大小出现后重新初始化OpenGL上下文。
    2. 按需绘制,而不是在WM_绘制中绘制。在WM_PAINT的处理程序中,什么也不做。使用计时器或其他机制定期触发显示器的更新。
    3. 在承载OpenGL内容的任何窗口上使用CS_OWNDC窗口样式,以便HDC在MDI窗口的生存期内不会因每条消息/每次调用而改变。

    可能适用的其他罕见干扰原因(因为您使用的是MDI窗口)

    1. WM_NCPAINT和其他相关的非客户端绘图消息-您可以通过将OpenGL内容移动到MDI窗口内没有边框的子窗口来解决这些问题。
    推荐文章