【问题标题】:Weird display errors in Windows GDI+ applicationWindows GDI+ 应用程序中出现奇怪的显示错误
【发布时间】:2013-02-11 15:13:58
【问题描述】:

我在使用 GDI+ 绘制应用程序的用户界面时遇到了一个奇怪的问题。有时会出现显示错误,显示其他应用程序的工件。有时我的文本控件的边框完全用黑色绘制。

在某些情况下,问题不仅仅是简单的显示错误。发生这种情况时,我的应用程序中嵌入了另一个应用程序的菜单或上下文菜单。此菜单不仅可见,您还可以通过将鼠标悬停在菜单条目上方并展开子菜单来突出显示菜单条目。但是,当您单击条目时,它们背后没有任何功能。这些菜单似乎始终是 Windows 资源管理器的一部分。

我不知道应该从哪里开始寻找这些问题的原因。也许这里的某人可以指出问题的可能根源,甚至是解决方案?

澄清:相同的代码在具有不同硬件、不同显卡驱动程序和不同操作系统(XP、Win7、Server 2008)的多台 PC 上显示此错误。我很想发布一些代码,但它非常复杂并且在整个应用程序中广泛传播。而且由于我不知道问题的根本原因是什么,因此我无法隔离代码的正确部分。

以下是一些截图:

我的文本控件和面板控件周围有黑色边框:

另一个应用程序的内容在我的应用程序窗口中绘制。您可以从左侧的 Windows 资源管理器中看到上下文菜单,在右侧看到 Excel 工作表的一部分。表格下部的网格表通常直接位于窗口标题栏下方: 在显示资源管理器上下文菜单的表单中显示错误:

【问题讨论】:

  • 我们需要更多信息,拜托:相同的代码在许多不同的 PC 上存在相同的问题,还是只有一个?不同的代码在你的电脑上有同样的问题吗?您是否尝试过升级图形驱动程序?愿意给我们看一些代码吗?等
  • 有时我的文本控件的边框完全是黑色的 你确定没有 GDI 句柄泄漏吗?
  • 我修复了一些泄漏的 GDI 对象。但问题仍然存在。

标签: c++ winapi user-interface gdi+


【解决方案1】:

正如你所说,你嵌入了另一个应用程序,我猜你正在使用经典的 GDI 调用和 GDI+?那是一件乏味的事情。我做了同样的事情,但它导致了一些问题,我的程序的某些部分没有被绘制并且变得不可见。

我的解决方案是(并且是)在使用 GDI-Functions 之前始终销毁所有 Gdiplus::Graphics - 或者您可以尝试调用 Graphics::Flush。

毕竟我必须承认,开始使用 GDI+ 是一个坏主意,将它混入现有的 GDI 应用程序是一个糟糕的主意。您应该只使用一个 API(可能是 direct3D)。 GDI+ 不是基于 GDI - 显然两者是并行工作的。

我刚刚发现这篇文章描述了混合 GDI 和 GDI+ 的一些限制:https://support.microsoft.com/en-gb/help/311221/info-interoperability-between-gdi-and-gdi

【讨论】:

  • 您好,谢谢您的回答。我没有嵌入另一个应用程序。这种行为是我们面临的错误的一部分。 Windows 资源管理器中的上下文菜单有时会显示在我们的应用程序中,这是错误症状的一部分。
  • 是的,我们确实混淆了 GDI 和 GDI+。你有类似的行为吗?
  • @RED SOFT ADAIR,您能否提供任何资源的链接,指出您不能混合使用 GDI 和 GDI+?
  • 不,我不能——这只是我痛苦的经历。
  • 不想挑衅,但多年来我一直在混合 GDI 和 GDI+,没有任何问题。 GDI+ 通常更容易使用,但 GDI 有时会快很多(尤其是使用位图),所以我发现同时使用两者确实很有帮助,可以两全其美。
猜你喜欢
  • 1970-01-01
  • 2014-12-25
  • 1970-01-01
  • 2016-08-16
  • 2020-11-10
  • 2011-06-15
  • 2017-03-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多