【问题标题】:Win32: Why does ReleaseDC() say my DC is not found?Win32:为什么 ReleaseDC() 说找不到我的 DC?
【发布时间】:2011-04-26 03:13:05
【问题描述】:

我先调用 getDC(hwnd),然后再调用 ReleaseDC(hwnd,dc)。这是一个 OpenGL 引擎,在我调用 WGLMakeCurrent(Null,Null) 和 WGLDeleteContext 之后。

ReleaseDC 返回错误代码 1425,即 1425L ERROR_DC_NOT_FOUND 传递给的 HDC 无效 发布DC。

我不明白以前从同一个 HWND 获取 HDC 后怎么会无效。

当我得到它时我检查了它的指针,它保持不变(不是说它有助于检查这样的东西),但我的想法已经不多了。

【问题讨论】:

  • 当你调用 ReleaseDC 时,它的窗口还活着吗?
  • 最好把有问题的部分代码也贴出来。

标签: winapi


【解决方案1】:

许多 OpenGl 示例(在我看来)在设备上下文方面做了一些奇怪的事情。如果您正在使用具有类似CS_OWNDC 样式的窗口,或者在应用程序的生命周期内缓存 HDC,则可能是您过度释放了 HDC,或者在窗口被破坏后试图释放它。

我还没有看到任何论文声称缓存 HDC(或使用像 CS_OWNDC 这样的样式)很重要,或者完全有助于 OpenGL 应用程序的性能。此外,绘制到 BeginPaint/EndPaint 之外的任何 DC 会使 NT 6.1 桌面窗口管理器的工作变得复杂,因此,在初始设置之外,我更喜欢简单地使用 WM_PAINT 消息来渲染 OpenGL 场景,并在相关上下文中切换通过 WGLMakeCurrent()。它使跟踪 HDC 变得更加易于管理(即您实际上不必这样做),并且您的应用突然可以同时处理多个 OpenGL 窗口。

【讨论】:

  • 我同意...我在一些示例中看到了这一点(即通过 WM_PAINT 处理渲染)。我希望我对此有更多了解。
【解决方案2】:

您是否将正确的 hwnd 作为第一个参数传递给 ReleaseDC?此外,您的窗口类可能需要设置 CS_OWNDC 类样式。

【讨论】:

    【解决方案3】:

    您确定您正确调用 ReleaseDC 吗?根据MSDN 应该是 ReleaseDC(hwnd, dc);

    【讨论】:

    • 我确定我调用它是正确的,只是不确定哪些东西会锁定或阻止 dc 被释放。我编辑了我的帖子以坚持我如何调用发布。
    • 好吧,ReleaseDC(hwnd) 甚至不会编译,所以这肯定是 OP 问题中的一个错字。
    猜你喜欢
    • 2017-09-18
    • 2014-04-15
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-30
    • 2021-01-09
    • 2011-11-19
    相关资源
    最近更新 更多