c++ - CClientDC 和 CWnd::GetDC 有什么区别

标签 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(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/

相关文章:

c++ - 是否可以操纵我的 CMDIFrameWndEx 的 CMFCMenuBar 的菜单?

C++ - 写入 VS2010 中的特定输出窗口 Pane

c++ - 从 char 获取字节值

c++ - Console+Windows的窗体

c++ - 为什么我在 TreeView 控件中没有获得复选框单击事件?

c++ - DLL中单例的销毁

c++ - RichEditControl 未调用 ON_EN_CHANGE 事件/处理程序

c++ - 除非音乐播放器程序正在运行,否则播放声音会跳过文件的前半秒

c++ - 在 C++ 中按值删除元素 - 首选成语真的由双重否定组成吗?

c++ - 如何将dll文件强加到当前目录下?