c++ - MFC 应用程序中奇怪的控件显示损坏

标签 c++ visual-studio-2010 mfc corruption

我有一个奇怪的问题,我一直无法诊断,希望有人至少能给我指出正确的方向。我有一个 C++ MFC 应用程序,它从各种来源收集数据并将其显示在屏幕上。然而,在随机间隔(通常大约 5-10 分钟)之后,显示以我从未见过或能够追踪的方式“损坏”,如下图所示(左边是正常的,右边是损坏的):

Example of Display Corruption

基本症状是:

  • 向上/向下箭头图像变成“5”和“6”。
  • 打开组合框列表只会显示项目文本(不显示列表边框和滚动条)。
  • 某些控件的背景颜色无法更新或无法正确显示。
  • Z 顺序被破坏,应用程序通过放置在顶部的其他窗口控制“泄漏”。
  • 在应用处于焦点状态时按 Print-Screen 不会再将窗口捕获到剪贴板。
  • 关闭并重新打开窗口没有任何作用。
  • 重新启动应用程序会使一切恢复正常。

我试图排除的可能原因包括:

  • 操作系统和计算机:从 Windows 7-64 位到 Windows Xp-32 位的各种系统都存在同样的问题。
  • 多线程:我添加了一个互斥锁来防止显示更新同时发生,但它没有效果(正如预期的那样)。
  • 内存损坏:这一直是我的假设,但根本没有内存损坏的迹象。基本显示代码和基本网络消息库已使用多年,没有出现类似问题。
  • 特定代码:我已将问题范围缩小到一个特定对话,其中包含一系列没有显示问题的对话。他们都使用相同的基本代码,这似乎表明问题在于对话框的特定显示代码。到目前为止,这个问题究竟是如何发生的,以及为什么发生的,这让我难以理解。

任何关于原因可能是什么或如何缩小范围的想法都会很棒。

更新 1: 做一些更多的计时/可重复测试,看起来让这个对话框运行一小会儿会导致问题。在问题出现之前,时间量始终在 300-400 秒之间。

最佳答案

听起来您的应用程序可能正在泄漏 GDI 对象。要检查是否是这种情况,请打开任务管理器并启用 GDI Objects 列。观察您的进程的数字,看看它是否在持续增加。

如果确实如此,您应该阅读 Detect and Plug GDI Leaks in Your Code with Two Powerful Tools for Windows XP .该 MSDN 文章还提供了一个名为 GDILeaks.exe 的工具,可以帮助您识别 GDI 泄漏。

如果这些症状在短时间内出现,则应该是重复绘制的东西没有正确释放 GDI 资源。可能在(或在其中调用)Windows 过程(例如 OnPaint)。

关于c++ - MFC 应用程序中奇怪的控件显示损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13254500/

相关文章:

c++ - cudamallocmanaged 是否足够聪明,不会复制不需要的数据?

c++ - 检查给定设备 ID 是否存在 Windows 驱动程序

c++ - Qt metaObject 链接器问题

c++ - 写入 UTF-8 BOM 时出现异常

windows - 使用 mfc/win32 将我程序自己的窗口的一部分保存到位图文件

javascript - 在 Visual Studio 中调试 javaScript。第一次机会异常(exception)

c++ - 令人困惑的私有(private)变量访问

visual-studio-2010 - Azure VM 大小可以通过服务配置来配置吗?

c++ - Visual Studio 关于多个类的荒谬错误

c++ - Visual Studio 2008 中的非托管 C++ 单元测试