录制屏幕时未出现奇怪的MFC/GDI行为(空白图像) [英] Odd MFC/GDI behaviour (blank image) that doesn't appear when screen is recorded
问题描述
我正在尝试修复程序中的这个奇怪的错误,但实际上我真的不知所措.我程序的这一部分有一个对话框,其中显示了使用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.
- 运行taskmgr.exe并添加"GDI对象"列.
- 运行软件并监视GDI对象计数.它稳定吗?
- 如果您的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屋!