CClientDC 是否保证将 DC 恢复到之前的状态?
Does CClientDC guarantee restoring the DC back to its previous state?
我正在使用 CClientDC
对象,它作为函数 GetDC
和 ReleaseDC
:
的包装器
- 函数
GetDC
从 CClientDC
构造函数内部调用
- 函数
ReleaseDC
从 CClientDC
析构函数内部调用
在此期间,我操作 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
。这些不会从 CDC
或 CClientDC
自动调用——您需要自己手动调用它们。
或者,您可以保存和恢复您修改的每个单独的 GDI 对象。当您调用 SelectObject
时,将返回原始对象。您保存它,并在取消选择您正在使用的对象时恢复它。
我正在使用 CClientDC
对象,它作为函数 GetDC
和 ReleaseDC
:
- 函数
GetDC
从CClientDC
构造函数内部调用 - 函数
ReleaseDC
从CClientDC
析构函数内部调用
在此期间,我操作 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
。这些不会从 CDC
或 CClientDC
自动调用——您需要自己手动调用它们。
或者,您可以保存和恢复您修改的每个单独的 GDI 对象。当您调用 SelectObject
时,将返回原始对象。您保存它,并在取消选择您正在使用的对象时恢复它。