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

时间:2017-06-04 10:42:48

标签: winapi mfc device-context

我正在使用CClientDC对象,该对象充当函数GetDCReleaseDC的包装器:

  • GetDC构造函数
  • 内部调用函数CClientDC
  • ReleaseDC析构函数
  • 中调用函数CClientDC

在两者之间,我操纵DC(更换笔,画笔等)。

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

这意味着我必须自己确认。这是对的吗?

谢谢。

1 个答案:

答案 0 :(得分:3)

从MFC源代码中打开wingdi.cpp并查找CClientDC的实现:

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

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

如果要保存和恢复DC的状态,可以使用以下特殊方法:CDC::SaveDCCDC::RestoreDC。这些不是从CDCCClientDC自动调用的 - 您需要自己手动调用它们。

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