VCにおけるCDCとHDCの違いと両者の変換


CDCはMFCのDCのクラスであり、HDCはDCのハンドルであり、APIのポインタのようなデータ型である.MFCクラスのプレフィックスはすべてCで始まり、Hで始まることの多くはハンドルで、これは助記のためで、プログラミングしてコードを読む/書く良い習慣です.CDC中のすべてのMFCのDCのベースクラス、よく使われるCClientDC dc(this);CDCのサブクラス(または派生クラス)です.CDCなどのデバイスの上下分類には、クラスのメンバー変数が1つ含まれています:m_nHdc;すなわちHDCタイプのハンドルである.次の一言を覚えておくと、理解に役立ちます.MFCのクラスは、window API文で開発された一定の機能を持つウィジェットである.(クラスとも呼ぶことができる).そのデフォルトの方法を使うのは、名前とパラメータを覚えることです(脳記の代わりにノートを使うことができます).Windows apiをアセンブリ言語にたとえると、MFCはBasic言語に相当する.
cdcはデバイス記述テーブルのベースクラスであり、clientDCはクライアント領域のデバイス記述テーブルを指し、PaintDCはOnPaint()関数にのみ使用される.
HDCはWINDOWSのデータ型であり、デバイス記述ハンドルである.CDCはMFCのクラスで、HDCに関するほとんどの操作をカプセル化しています.このように、HDC定義の変数は、デバイスに関する内容を記述するために使用されるメモリを指すので、HDC定義はポインタであると考えてもよい.一方、CDCクラスは、HDC定義のデバイス記述テーブルと、HDCに関連する操作の関数を含むオブジェクトを定義します.これはHPENとCPen,POINTとCPointの差と同じである.
方法1:この方法は、デバイスの終了時に元のリソースを破棄しない(すなわち、hDC、hBitmap)
CDC *pDC = CDC::FromHandle(hDC);
CBitmap *pBitmap = CBitmap::FromHandle(hBitmap);

メソッド2:このメソッドは、デバイスの終了時に元のリソース(すなわち、hDC、hBitmap)を破棄します.
CDC dc;
HDC hDc;
dc.Attach(hDC);
CBitmap bit;
bit.Attach(hBitmap);

終了時にdcを加える.detach()も元のリソースを破棄しません
HDC hdc;
CDC cdc;
//cdc hdc
hdc = cdc.GetSafeHdc();
//hdc cdc
cdc.Attach(hdc);

方法3:
CDC dc;
HDC hDC; 
hDC= dc.m_hDC             //cdc hdc 
dc.FromHandle(hDC);    //hdc cdc

dc.FromHandle(hDC)はdcを生成するが、一時的であり、mfcはシステムがいつdcを削除するかを保証しない.
dc.Attach(hDC)はこのdcの生命が正常に終わるまで永久である.