【问题标题】:What are the differences between CClientDC and CWnd::GetDCCClientDC 和 CWnd::GetDC 有什么区别
【发布时间】:2013-03-07 04:09:14
【问题描述】:

我想知道 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

两个代码 sn-ps 看起来相同,只是语义不同,但如果有区别的话,区别在哪里?对于它们的使用,我有什么需要注意的。

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上的功能描述。

【问题讨论】:

  • 花一点时间阅读CWnd::GetDC()CClientDC 上的文档可能会回答您的问题。它们都是客户端设备上下文包装器。

标签: c++ mfc


【解决方案1】:

有 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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2011-08-16
        • 2016-07-02
        • 2010-10-02
        • 2011-12-12
        • 2010-09-16
        • 2012-03-14
        • 2012-02-06
        • 2011-02-25
        • 2011-11-22
        相关资源
        最近更新 更多