gpt4 book ai didi

c++ - 录制屏幕时不会出现奇怪的 MFC/GDI 行为(空白图像)

转载 作者:行者123 更新时间:2023-11-30 04:31:53 28 4
gpt4 key购买 nike

我正在尝试修复我的程序中的这个奇怪错误,但我真的不知道它可能是什么。我程序的这一部分有一个对话框,使用 MFC/GDI 显示各种项目的预览。当我滚动浏览不同的项目时,有时预览图像会消失并变成空白。然而,它:

  • 只发生在某些机器上
  • 显然发生在 Windows 7 和 XP 上
  • 不会每次都发生在同一个项目上
  • 截图时项目仍然存在,但正常查看时它是空白的。
  • 当我尝试使用断点跟踪它时,它似乎在整个代码的随机位置发生。它并不总是在屏幕从图像变为空白的同一位置,这使我相信它不会发生在与我的主线程相同的线程中,即使那确实是当时唯一没有被阻塞的线程。这意味着它发生在 Windows 线程或其他东西中,不是吗?

我假设这是某种竞争条件,但屏幕截图中预览的行为尤其让我感到困惑。为什么截屏没问题,在屏幕上看却一片空白?是否有某种绕过屏幕上显示或更新内容的“打印屏幕”机制?

我意识到我没有提供太多信息,人们显然帮不上什么忙,但如果有人能想到任何东西,我将不胜感激:)

谢谢!

最佳答案

另一种说法:GDI资源泄露

如果您忘记释放 GDI 对象,奇怪的事情就会开始发生——包括未绘制的区域。

  1. 运行 taskmgr.exe 并添加“GDI 对象”列。
  2. 运行您的软件并监控 GDI 对象计数。它稳定了吗?
  3. 如果您的 GDI 对象计数不稳定,请查看相关的 WM_PAINT 处理程序。

这是一个 GDI 泄漏的例子:

void CMyWnd::OnPaint()
{
CPaintDC dc(this);
dc.SelectObject(&font);
}

必须始终取消选择选定的 GDI 对象:

void CMyWnd::OnPaint()
{
CPaintDC dc(this);
CFont *pOldFont = dc.SelectObject(&font);
// Use font
dc.SelectObject(pOldFont);
}

关于c++ - 录制屏幕时不会出现奇怪的 MFC/GDI 行为(空白图像),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8013564/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com