gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:27:46 30 4
gpt4 key购买 nike

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

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com