我想知道 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和GetDC见 MSDN 上的功能描述。