Attach関数の説明

2470 ワード

Attach関数はMFCでは比較的一般的であり,CWndクラス,CDCクラス,CBitmapクラスなど,多くのクラスでこのメンバー関数がある.一般的に言えば、
Windowsのリソースハンドルとc++オブジェクトを関連付け、ウィンドウはリソースであり、図形描画デバイスもリソースであるため、クラスにはwindowsのリソースハンドルとc++オブジェクトを関連付ける機能があります.抽象的なようですが、次はCWndクラスのAttachで詳しく説明します.見終わってから振り返ってみると、わかります.
CWnd::Attach
Attaches a Windows window to a CWnd object. //WindowsウィンドウをCWndオブジェクト上のBOOL Attach(HWND hWndNew)に関連付けます.パラメータの説明:hWndNew
Windowsウィンドウのハンドルの使用:ウィンドウをCWndオブジェクトにattachします.(この関数はCWndオブジェクトのメンバー関数であり、C++のCwndオブジェクトがWindowsのwindowを呼び出していることをよりよく理解しています.)コンセプト:C++オブジェクトとWindowsウィンドウ(ウィンドウリソース)の違い:良い説明:
まず、Windowsウィンドウ(ウィンドウリソース)とC++オブジェクトの違いを理解してください.MFCはCWndクラスをカプセル化する際、実際にWindowsオブジェクト(ウィンドウリソース)全体をパッケージ化していません.ウィンドウハンドルが1つあるだけです.このウィンドウハンドルが実際に存在するウィンドウリソースを指す場合、このC++オブジェクトは有効です.そうしないと、このC++オブジェクトは空になります.まだ分からない場合は、MFCを使用してウィンドウを作成する場合は、2つのステップに分けて行います.最初のステップは、newのCWndオブジェクトです.このステップはC++オブジェクトを作成しますが、HWNDは不正です.対応するWindowsウィンドウリソースがまだ作成されていないためです.第2ステップでは、CWndのメンバー関数Createを呼び出して本格的なWindowsウィンドウリソースを作成するとともに、以前に作成したCWndオブジェクトのHWNDメンバーをそのウィンドウに指し示すことで、ウィンドウの作成が完了します.SDK方式であれば、WNDCLASS構造を作成し、CreateまたはCreateExを呼び出すだけでウィンドウが作成されます.はい、今あなたの質問に答えて、あなたは仮定することができて、今あなたはすでに有効なウィンドウリソースのハンドルを持っていて、それではあなたはこのウィンドウリソースとCWndオブジェクトを関連付けてどうしますか?簡単ですが、Attachでは、実はCWndオブジェクトのHWNDメンバーをこのウィンドウハンドルに向けます.これがAttachの主な任務です.2つ目は、Detachについてです.前述したように、WNDCLASSは実はCWndとはまったく関係ありません.それらの間はCWndのメンバーHWNDによってのみ関連付けられている.Attachを「結婚」と見なせば、Detachは「離婚」であり、通俗的にはCWndオブジェクトと有効な窓の臍帯を切断することである.どうして切るの?CWndはC++のオブジェクトであるため、C++のオブジェクトには生存期間の概念があり、そのオブジェクトの役割ドメインから離れて、このオブジェクトは破棄されなければならないが、Windowsリソースにはこの特徴はなく、CWndオブジェクトを破棄するとき、WNDCLASSと一緒に破棄する必要はない.それ以前に、私たちはまずこの「臍帯」を切断しなければならない.「城門の火事が池の魚に及ぶ」のを避ける.同様にCBitmapのAttachにとって、基本的にはビットマップリソースハンドルをCBitmapのオブジェクトに添付します.例えば、loadimageでビットマップリソースを作成し、ビットマップリソースのハンドルhandleを得ました.今、cbitmapクラスのメンバー関数でこのビットマップリソースを操作したいと思っています.
cbitmapオブジェクトを宣言しattachで関連付けることができます
後でcbitmapのメンバー関数を使ってhbitmapを操作することができます
まとめ:Cwndオブジェクトは空のシェルであり、具体的なWindowsウィンドウリソースが必要です.
CWndとCBitmapで説明しましたが、CDCでコードの例を示します.
画面DCと互換性のあるメモリDCを作成し、このメモリDCで描画操作を行いたいのですが、メモリDCを作成する手順を2つに分けます.
1.画面dcの取得
2.画面互換メモリdcの作成
/1.    dc,           HDC  
HDC hdc = ::GetDC(NULL);
//    CDC  ,         
dcCDC cDC;
cDC.Attach(hdc);

CDC memDC;
//2.         dc,  CreateCompatibleDC       CDC   
memDC.CreateCompatibleDC(&cDC);
//      
...

ステップ1とステップ2のパラメータタイプが異なるため、途中で小さな変換を行い、Attachを用いた
注意:これはCDCがAttachを使用している例を示すためのもので、コードの実装方法にこだわらないでください.