内存DC上的SelectObject

时间:2012-05-23 22:57:33

标签: c++ winapi gdi

在我的程序中,我有一个我常常绘制的内存DC,然后在回复WM_PAINT时,我快速BitBlt到屏幕上。我总是像这样完成绘图,内存DC是为响应WM_CREATE btw而创建的。

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之后是否可以保存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仍会使用它。)

2 个答案:

答案 0 :(得分:2)

危险在于您可能会将选定的对象留在内存DC中,一次只能由一个DC使用。传统上,您在绘制周期结束时取消选择DC外的对象,以便可以将对象选择到另一个DC中。如果你延迟取消选择,那么没有其他人可以使用该对象,因为它仍在你的DC中。

答案 1 :(得分:0)

我认为没问题。 至于恢复DC,我认为如果不恢复默认对象,可能会由于错误的引用计数而导致内存泄漏。这只是基于Microsoft文档的猜测。