4

完全にカスタム描画された UI (つまり、テキストで満たされたボックスの集まり) を持つアプリケーションがあります。約 30 ~ 60 分の実行時間の後、UI 要素が自然に変化します。たとえば、白い線 (ボックスの境界線) が消えたり、テキストのサイズが変更されたりします。

画面の 1 つの前後の画像にリンクしました。これは、すべての白い線が消えたことを示しています。他の画面では、テキスト サイズが大幅に変更されています。

前: 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
}

誰もこのような奇妙な行動を見たことがありますか? 調査する場所に関するヒントはありますか?

ありがとう!

4

1 に答える 1

2

以前、GDI ハンドルの 1 つの状態を復元するのを忘れたときに、このような問題を解決したことがあります。解決策は、 と を使用SaveDCするRestoreDCことでした。これは、DC 内のオブジェクトを使い終わった後に復元する必要がないことを意味します。ここからすべての作業を行う非常に便利な RAII クラスをダウンロードできます。

2 つ目の提案は、独自のオブジェクトを作成するのではなく、ストック オブジェクトと組み込みの 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));

これらの 2 つのポインターを使用して、自分のものを描画します。利点は、何も割り当てていないため、何もリークできず、ストック オブジェクトが常に存在するため、呼び出しが失敗しないことです。

于 2013-04-09T20:19:17.923 に答える