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はそれに関する情報を提供しません。CClientDCおよびGetDCについては、MSDNの関数の説明を参照してください。

4

3 に答える 3

4

DC には、共通 DC、クラス DC、およびプライベート DC の 3 種類があります。GetDC() が共通 DC を返す場合は、ReleaseDC() を呼び出す必要があります。GetDC() がクラス DC またはプライベート DC を返す場合、ReleaseDC() を呼び出しても何も起こりません。

そのため、コードの 2 番目の部分でリソース リークが発生する可能性が非常に高くなります。

この記事では、3 種類の DC について詳しく説明しています: http://www.codeproject.com/Articles/2078/Guide-to-WIN32-Paint-for-Intermediates

于 2013-03-07T05:06:30.277 に答える
1

ClientDC() は getDC() と releaseDC() を暗黙のうちに管理します。それを処理する必要はありません。

また、GetDC() の呼び出し時に、ウィンドウ以外のデバイス コンテキストを使用している場合は、releasedc() を明示的に呼び出す必要があります。

于 2013-03-08T07:00:21.703 に答える