CClientDC 是否保证将 DC 恢复到之前的状态?

Does CClientDC guarantee restoring the DC back to its previous state?

我正在使用 CClientDC 对象,它作为函数 GetDCReleaseDC:

的包装器

在此期间,我操作 DC(更换笔、刷子等)。

但我很确定 CClientDC 对象不会将 DC 恢复到之前的状态。

这意味着我必须自己确定。对吗?

谢谢。

从MFC源码中打开wingdi.cpp,寻找CClientDC:

的实现
CClientDC::~CClientDC()
{
    ASSERT(m_hDC != NULL);
    ::ReleaseDC(m_hWnd, Detach());
}

您看到它只调用 ReleaseDC不会 将 DC 恢复到它以前的状态。 CClientDC 无法知道您更改了哪些 GDI 对象。

如果要保存和恢复DC的状态,有专门的方法:CDC::SaveDC and CDC::RestoreDC。这些不会从 CDCCClientDC 自动调用——您需要自己手动调用它们。

或者,您可以保存和恢复您修改的每个单独的 GDI 对象。当您调用 SelectObject 时,将返回原始对象。您保存它,并在取消选择您正在使用的对象时恢复它。