我想知道 CClientDC 和 CWnd::GetDC 之间是否有任何区别。尽管存在资源分配和语义问题,但两者似乎相当平等。
一个例子:
CClientDC dc(this); // "this" is sub-classed object of CWnd
CGdiObject* oldObj = dc.SelectStockObject(WHITE_BRUSH);
... do some with dc ...
dc.SelectObject(oldObj);
// Device object is stack object, ReleaseDC called automaticly
或
CDC* dc = this->GetDC(); // "this" is sub-classed object of CWnd
CGdiObject* oldObj = dc->SelectStockObject(WHITE_BRUSH);
... do some with dc ...
dc->SelectObject(oldObj);
// Device context belongs to a window class no need to call ReleaseDC
// I don't allocate dc, so I don't delete it
除了语义不同之外,这两个代码片段看起来完全相同,但如果有区别的话,区别在哪里呢?我有什么需要关注他们的使用。
GetDC() 只是 CClientDC(this) 的捷径吗? 我有点困惑。
编辑:在某些情况下,CClientDC() 返回的设备上下文与 GetDC() 返回的设备上下文不同,我想知道原因。
例子:
HRC hRC = wglCreateContext(GetDC()->m_hDC); // work's as expected.
但是
ClientDC dc(this)
HRC hRC = wglCreateContext(dc.m_hDC); // does not work as expected, output in
// clients device context not screen visible.
因此,同一窗口中的两个客户端设备上下文之间肯定存在细微差别,但 MSDN 并未提供这方面的信息。 CClientDC 参见 MSDN 上的功能说明和 GetDC .
最佳答案
有 3 种类型的 DC:普通 DC、类 DC 和私有(private) DC。如果 GetDC() 返回一个公共(public) DC,则必须对其调用 ReleaseDC()。如果 GetDC() 返回类 DC 或私有(private) DC,则调用 ReleaseDC() 时不会发生任何事情。
所以你的第二段代码很可能存在资源泄漏。
本文详细介绍了 3 种类型的 DC:http://www.codeproject.com/Articles/2078/Guide-to-WIN32-Paint-for-Intermediates
关于c++ - CClientDC 和 CWnd::GetDC 有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15262903/