MFC绘制的元素在30-60分钟后发生变化

MFC drawn elements change after 30-60 minutes

本文关键字:变化 30-60分钟 绘制 元素 MFC      更新时间:2023-10-16

我有一个完全自定义绘制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句柄的状态时。解决方案是使用SaveDCRestoreDC,这意味着在处理完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));

现在用这两个指针来画你的东西。这样做的好处是您没有分配任何内容,因此不会泄漏任何内容,并且调用不会失败,因为库存对象始终存在。