【问题标题】:SelectObject on memory DC内存 DC 上的 SelectObject
【发布时间】:2012-05-23 22:57:32
【问题描述】:

在我的程序中,我有一个我经常绘制的内存 DC,然后为了响应WM_PAINT,我迅速将BitBlt 显示在屏幕上。我一直都是这样画的,内存DC是响应WM_CREATEbtw创建的。

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 仍会使用它)。

【问题讨论】:

    标签: c++ winapi gdi


    【解决方案1】:

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

    【讨论】:

    • 谢谢,所以当我确信这些对象没有在其他地方使用时没关系(它们是类的私有成员,所以没问题)。我还注意到对 DeleteObject 的调用在删除对象失败时并不总是返回零,因为它仍然被选入 DC,非常奇怪。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2011-06-10
      • 2011-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-12
      • 2011-04-07
      • 2016-02-02
      • 1970-01-01
      相关资源
      最近更新 更多