1

私のプログラムには、頻繁に描画するメモリ DC があり、それに応じてWM_PAINTすばやくBitBlt画面に表示されます。私はいつもこのように描画を行ってきました.メモリDCはWM_CREATEbtwに応答して作成されます.

void Draw()
{
    HFONT hPrevFont = (HFONT)SelectObject(m_hMemDC, m_hFont);
    // draw text
    SelectObject(m_hMemDC, hPrevFont);
}

SaveDCどちらが正しいはずですが、そのために使用できることもわかりましたRestoreDC(特に、多くのGDIオブジェクトがある場合に役立ちます)

void Draw()
{
    int nSavedDC = SaveDC(m_hMemDC);
    SelectObject(m_hMemDC, m_hFont);
    // draw text
    RestoreDC(m_hMemDC, nSavedDC);
}

今、DC を作成した後に状態を保存し、削除するときに復元するだけでよいかどうか疑問に思います。このような:

int OnCreate(...)
{
    m_hMemDC = CreateMemDC();
    m_nSavedDC = SaveDC(m_hMemDC);
}

void Draw()
{
    SelectObject(m_hMemDC, m_hFont);
    // draw text
}

void OnDestroy()
{
    RestoreDC(m_hMemDC, m_nSavedDC);
    DeleteMemDC(m_hMemDC);
}

これで問題ないと思います。その間、他の誰かが私のメモリ DC を使用しているわけではありません。どう思いますか?

この場合、DCを保存して復元する必要さえありますか?

編集:はい、フォントを削除する前にメモリDCを最初に削除する必要があることを認識しています(そうしないと、メモリDCによって引き続き使用されるため)。

4

2 に答える 2

2

危険なのは、一度に1つのDCしか使用できないオブジェクトをメモリDCに選択したままにしておくことです。従来、描画サイクルの最後にDCからオブジェクトの選択を解除して、オブジェクトを別のDCで選択できるようにします。選択解除を遅らせると、オブジェクトはまだDCにあるため、他の誰もそのオブジェクトを使用できなくなります。

于 2012-05-23T23:26:44.697 に答える
0

これで問題はないと思います。DC を復元する限り、既定のオブジェクトを復元しないと、不適切な参照カウントによってメモリ リークが発生する可能性があると思います。これは、Microsoft のドキュメントに基づいた単なる推測です。

于 2012-05-23T23:07:04.203 に答える