我想知道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上CClientDC和GetDC的功能说明。
答案 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在下一个结束时消失了。