选择内存 DC 上的对象



在我的程序中,我有一个我经常绘制的内存DC,然后为了响应WM_PAINT我迅速将其BitBlt到屏幕上。我一直是这样画的,内存 DC 是为了响应WM_CREATE顺便说一句而创建的。

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

这应该是正确的,我现在还发现我可以为此使用 SaveDCRestoreDC(在拥有大量 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 使用)。

危险在于,您可能会将一个对象保留到内存 DC 中,该对象一次只能由一个 DC 使用。传统上,您在绘制周期结束时从 DC 中取消选择对象,以便可以选择该对象到另一个 DC 中。如果延迟取消选择,则其他用户无法使用该对象,因为它仍在您的 DC 中。

我认为这没有问题。就恢复 DC 而言,我认为如果您不恢复默认对象,不正确的引用计数可能会造成内存泄漏。这只是基于Microsoft文档的猜测。

最新更新