MFC绘制的元素在30-60分钟后发生变化
MFC drawn elements change after 30-60 minutes
我有一个完全自定义绘制UI的应用程序(即只是一堆填满文本的框)。在大约30-60分钟的运行时间后,UI元素会自发地发生变化。例如,白线(框边)消失,文本大小调整等。
我已经链接到其中一个屏幕的一些前后图像。这张图显示所有的白线都消失了。其他屏幕显示文本大小的显著变化。
: http://s21.postimg.org/cogqodson/BEFORE.png
后:http://s24.postimg.org/7skx21sid/AFTER.png
本项目是在MS Visual c++ 2010中使用MFC编写的,运行在Windows 7 Pro上。
下面是我的OnPaint()代码:void CMainWindow::OnPaint()
{
CPaintDC dcScreen( this );
CBitmap bitmap;
bitmap.CreateCompatibleBitmap( &dcScreen, m_rect.Width(), m_rect.Height() );
CDC dc;
dc.CreateCompatibleDC( &dcScreen );
CBitmap* pOldBitMap = dc.SelectObject( &bitmap );
dc.FillRect(m_rect, &BGBRUSH);
int bkmode = dc.SetBkMode(TRANSPARENT);
dc.SelectObject(&BGBRUSH);
CPen brightwhitepen(PS_SOLID, 5, RGB(255,255,255));
CPen* pOldPen = dc.SelectObject(&brightwhitepen);
// draw some stuff:
// dc.Rectangle, dc.DrawText, etc.
// ...
// Blit the memory device context to the screen device context
dcScreen.BitBlt
(
0,
0,
m_rect.Width(),
m_rect.Height(),
&dc,
0,
0,
SRCCOPY
);
dc.SetBkMode( bkmode ); // Restore old background mode
dc.SelectObject( pOldPen ); // reselect old pen
dc.SelectObject( pOldBitMap ); // Restore old bitmap
}
有人见过这样奇怪的行为吗?在哪里调查有什么建议吗?
谢谢!
我曾经解决过这样一个问题,当我忘记恢复一个GDI句柄的状态时。解决方案是使用SaveDC
和RestoreDC
,这意味着在处理完DC中的任何对象后,您不必恢复它们。您可以在这里下载一个非常方便的RAII类,它可以为您完成所有的工作。
第二个建议是使用库存对象和内置DC句柄,而不是创建自己的。所以像这样替换你的brightwhitepen
代码:
dc.SetDCPenColor(RGB(255,255,255));
CPen* pBrightwhitepen = CPen::FromHandle((HPEN)GetStockObject(DC_PEN));
dc.SetDCBrushColor(RGB(0,0,255));
CBrush* pBgBrush = CBrush::FromHandle((HBRUSH)GetStockObject(DC_BRUSH));
现在用这两个指针来画你的东西。这样做的好处是您没有分配任何内容,因此不会泄漏任何内容,并且调用不会失败,因为库存对象始终存在。
相关文章:
- C++取消引用指针.为什么会发生变化
- 为什么在读取文件大小时文件IO速度会发生变化
- 为什么cudaMemGetInfo报告设备内存总量的变化
- Boost::posix_time::ptime舍入到给定的分钟数
- 填孔方法需要20分钟以上
- 如何避免LED在循环状态变化中闪烁?
- 当 I2C 值在C++中发生变化时收到通知
- Gtkmm 会不断检查 Gtk::日历上的所选日期是否发生变化
- 提升,以分钟精度获得 UTC 时间
- 当我调用对象的方法时,对象的成员会发生变化
- 为什么向量内部的指针在从函数返回时会发生变化?
- 如何在 c++ 中循环中使用频率变化的声音?
- 对于使用高级服务的分钟数和应付金额,我不断得到相同的数字
- 为什么 C++ 中的零会发生变化
- 为什么我的全局变量似乎没有变化?
- 如何在无法访问 vblank 的情况下实现平均 60(或 30,或其他数字)FPS?
- EnumDesktopWindows(C++)大约需要30分钟才能在Windows 10上找到所需的打开窗口
- 每30分钟滚动一次日志
- MFC绘制的元素在30-60分钟后发生变化
- 打开一些文件,等待大约30分钟,在C++中重新启动它们