3

我想知道 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 没有提供这方面的信息。CClientDCGetDC见 MSDN 上的功能描述。

4

3 回答 3

4

DC 有 3 种类型:普通 DC、类 DC 和私有 DC。如果 GetDC() 返回一个公共 DC,则必须对其调用 ReleaseDC()。如果 GetDC() 返回类 DC 或私有 DC,则调用 ReleaseDC() 将不会发生任何事情。

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

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

于 2013-03-07T05:06:30.277 回答
1

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

于 2014-08-05T19:49:15.113 回答
1

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

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

于 2013-03-08T07:00:21.703 回答