CClientDC和CWnd :: GetDC之间有什么区别

时间:2013-03-07 04:09:14

标签: c++ mfc

我想知道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(这个)的捷径吗? 我有点困惑。

编辑: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不会向我提供相关信息。请参阅MSDN上CClientDCGetDC的功能说明。

3 个答案:

答案 0 :(得分:4)

有3种类型的DC:公共DC,DC类和专用DC。如果GetDC()返回公共DC,则必须在其上调用ReleaseDC()。如果GetDC()返回类DC或私有DC,则在调用ReleaseDC()时不会发生任何事情。

因此,您的第二段代码中很可能存在资源泄漏。

本文详细介绍了3种类型的DC:http://www.codeproject.com/Articles/2078/Guide-to-WIN32-Paint-for-Intermediates

答案 1 :(得分:1)

ClientDC()隐式管理getDC()和releaseDC()。我们不需要处理它。

在调用GetDC()时,如果我们使用非窗口设备上下文,那么我们需要显式调用releasedc()。

答案 2 :(得分:1)

关于CClientDC的一个重要的事情是它是一个 - 所以当它脱离上下文时,你的dc也是如此。类构造函数调用GetDC,析构函数调用ReleaseDC。这意味着dc在下一个结束时消失了。