テクニカル ノート 3: Windows ハンドルとオブジェクト間のマップ
ここでは、C++ オブジェクトにマッピング ウィンドウ オブジェクト ハンドルをサポートする MFC ルーチンについて説明します。
問題
window オブジェクトは、MFC クラスの折り返しのウィンドウ オブジェクトが C++ オブジェクトを処理する ハンドル のさまざまな通常オブジェクトによって表されます。 MFC のクラス ライブラリ関数をラップするハンドルは特定のハンドルを持つウィンドウ オブジェクトをラップしている C++ オブジェクトを見つけることができます。 ただし、オブジェクトに対する C ++.のラッパー オブジェクトがないため、これらの時点でシステムは C++ のラッパーとして機能する一時オブジェクトが作成されます。
次のように使用のハンドルのマップがあります。ウィンドウ オブジェクト:
HWND (CWnd と CWnd-派生クラス)
HDC (CDC と CDC-派生クラス)
HMENU (CMenu)
HPEN (CGdiObject)
HBRUSH (CGdiObject)
HFONT (CGdiObject)
HBITMAP (CGdiObject)
HPALETTE (CGdiObject)
HRGN (CGdiObject)
HIMAGELIST (CImageList)
ソケット (CSocket)
ハンドルをこれらのオブジェクトのいずれかにより、静的 FromHandleメソッドを呼び出して、ハンドルをラップする MFC オブジェクトを参照できます。 たとえば、HWND を指定 hWnd、次の行を返します hWndをラップする CWnd へのポインターという:
CWnd::FromHandle(hWnd)
hWnd に特定のラッパー オブジェクトが存在しない場合 hWndをラップするには、一時 CWnd が作成されます。 これは、ハンドルの有効な C++ オブジェクトを取得できるようにします。
ラッパー オブジェクトが見つかったら、ラッパー クラスのパブリック メンバー変数からハンドルを取得できます。 CWndの場合、m_hWnd はそのオブジェクトの HWND が含まれます。
MFC オブジェクトへのハンドルの接続
ウィンドウ オブジェクトへの新しく作成されたハンドル ラッパー オブジェクトおよびハンドルは、この例のように Attach 関数を呼び出して 2 を関連付けることができますが、T:
CWnd myWnd;
myWnd.Attach(hWnd);
これは myWnd と hWndを関連付けるパーマネント マップのエントリを作成します。 CWnd::FromHandle(hWnd) を呼び出すと、myWndでポインターを返します。 myWnd が削除された場合、デストラクターは Windows の DestroyWindow 関数を呼び出すことによって自動的に hWnd を破棄します。 これは、望まれなければ hWnd は myWnd が定義された) 離れたときにスコープを myWnd が破棄される前に myWnd からデタッチする必要があります (通常は。 Detach のメソッドはこれを行います。
myWnd.Detach();
一時オブジェクトの詳細
一時オブジェクトは FromHandle が既にラッパー オブジェクトを持っていないハンドルで提供されるたびに作成されます。 これらの一時オブジェクトがハンドルからデタッチ、DeleteTempMap 関数によって削除されます。 既定で CWinThread::OnIdle は自動的に一時ハンドル マップをサポートする各クラスの DeleteTempMap を呼び出します。 これは、一時オブジェクトへのポインターがポインターを含む関数が終了したポイントまで有効であるとできないことを意味します。
ラッパー オブジェクトと複数のスレッド
一時と永続的なオブジェクトはスレッドごとに保持されます。 つまり、1 個のスレッドは一時または永続的かどうか別のスレッドの C++ のラッパー オブジェクトに関係なく、アクセスできません。
1 種類のスレッドから別のプロジェクトにこれらのオブジェクトを渡すには、HANDLE のネイティブ型を常に移動します。 1 種類のスレッドから別の場所に C ++.のラッパー オブジェクトを渡すと、予期しない結果になります。