录制屏幕时未出现奇怪的MFC/GDI行为(空白图像) [英] Odd MFC/GDI behaviour (blank image) that doesn't appear when screen is recorded

查看:117
本文介绍了录制屏幕时未出现奇怪的MFC/GDI行为(空白图像)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试修复程序中的这个奇怪的错误,但实际上我真的不知所措.我程序的这一部分有一个对话框,其中显示了使用MFC/GDI的各种项目的预览.当我滚动浏览不同的项目时,有时预览图像会消失并变为空白.但是,它是:

There is this weird bug in my program that I'm trying to fix, but I'm really at a loss for what it could be. This part of my program has a dialog which shows previews of various items using MFC/GDI. When I scroll through different items, sometimes the preview image just disappears and goes blank. However, it:

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

我假设这是某种竞赛条件,但是特别是屏幕截图中的预览行为使我感到困惑.为什么拍摄屏幕截图会好,但是在屏幕上查看时却空白呢?是否有某种打印屏幕"机制可以绕过屏幕上显示或更新的内容?

I'm assuming it's a race condition of some sort, but the behaviour of the preview in screenshots, in particular, rather confuses me. Why would it be fine when taking a screenshot but be blank when viewing it on screen? Is there some mechanic of the "printscreen" that bypasses what's displyed or updated on the screen?

我意识到我没有提供太多信息,人们显然也无济于事,但是如果有人能想到任何事情,将不胜感激:)

I realize that I haven't given much information and that people obviously can't help much, but if anyone could think of ANYTHING, it would be much appreciated :)

谢谢!

推荐答案

另一种理论:GDI资源泄漏

Another theory: GDI resource leak

如果您忘记释放GDI对象,则会发生奇怪的事情-包括未上漆的区域.

If you forget to free your GDI objects, weird things start to happen - including unpainted areas.

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

以下是GDI泄漏的示例:

Here's an example of a GDI leak:

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

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

Selected GDI objects must always be deselected:

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

这篇关于录制屏幕时未出现奇怪的MFC/GDI行为(空白图像)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆