我有一个完全自定义绘制UI的应用程序(即只有一堆带文字的填充框).在大约30-60分钟的运行时间之后,UI元素自发地改变.例如,白线(框边框)消失,文本调整大小等.
我已经链接到其中一个屏幕的前后图像.这表明所有的白线都消失了.其他屏幕显示文本大小的显着变化.
之前:http://s21.postimg.org/cogqodson/BEFORE.png
之后:http://s24.postimg.org/7skx21sid/AFTER.png
此项目使用MFC在MS Visual C 2010中编写,并在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中的任何对象.您可以在这里下载一个
really convenient RAII class,为您完成所有工作.
第二个建议是使用库存对象和内置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));
现在使用这两个指针来绘制你的东西.优点是你没有分配任何东西,所以你不能泄漏任何东西,并且调用不会因为库存对象总是存在而失败.