この MFC について説明します Windows のマッピングをサポートするルーチン オブジェクト C++ オブジェクトへのハンドル。
問題
Windows オブジェクトは、通常処理s で表されます。MFC クラスは、C++ オブジェクトと Windows オブジェクト ハンドルをラップします。MFC クラス ライブラリのハンドル ラッパー関数、Windows オブジェクトを特定のハンドルをラップする C++ オブジェクトを見つけることができます。あるとき、Windows オブジェクトは C++ ラッパー オブジェクトし、一時オブジェクトを作成して、C++ のラッパーとして動作するこれらの回ではありません。
Windows オブジェクト ハンドル マップを使用します。:
ハンドルをこれらのオブジェクトのいずれかを指定すると、静的メンバー関数FromHandleを呼び出すことでハンドルをラップする MFC オブジェクトを見つけることができます。たとえば、指定されたHWND hWndをと呼ばれる:
CWnd::FromHandle(hWnd)
ポインターは、 hWndをラップ、 CWndを返します。そのhWndが特定のラッパー オブジェクトがあるない場合は、 hWndをラップする一時的なCWndが作成されます。これは有効な C++ オブジェクトを任意のハンドルから取得できます。
ラッパー オブジェクトとは、パブリック メンバー変数をハンドルに得ることができます。CWndの場合、そのオブジェクトのHWNDのm_hWndが含まれています。
MFC オブジェクトにハンドルを取り付ける
新しく作成したハンドル ラッパー オブジェクトと、ハンドルを Windows オブジェクトを与え、 Attachを呼び出すことによって、2 つを関連付けることができます。たとえば:
CWnd myWnd;myWnd.Attach(hWnd)
これは、エントリmyWndとhWndパーマネント マップになります。ポインターをCWnd::FromHandle(hWnd) を呼び出すと、今、 myWndにコンピューターを返されます。MyWndが削除されると、デストラクター自動的に hWnd Windows DestroyWindow関数を呼び出すことによって破棄されます。このする必要がない場合は、(通常は、 myWndでスコープを残し定義したとき)、 myWndオブジェクトが破棄される前に、 hWnd myWndからデタッチする必要があります。Detachメンバー関数これは。
myWnd.Detach()
一時オブジェクトの詳細
FromHandleラッパー オブジェクトを持たないハンドルが渡された場合に一時オブジェクトが作成されます。これらの一時オブジェクトがそのハンドルからデタッチされ、 DeleteTempMap関数を削除します。CWinThreadの既定OnIdle処理は、一時のハンドル マップをサポートしている各クラスに対してDeleteTempMapを自動的に呼び出します。つまり、一時オブジェクトは、Windows メッセージ ループのアイドル時に削除されます、一時オブジェクトへのポインターは、ポインターを取得した、有効、関数から終了の時点になりますと仮定することはできません。
ラッパー オブジェクトと複数のスレッド
一時と永続的なオブジェクトは、スレッドごとに維持されます。つまり、1 つのスレッド別のスレッドの一時的または永続的であるかどうかに関係なく、C++ のラッパー オブジェクトにアクセスできません。一時オブジェクトに属するスレッドがOnIdleになると上記のように、一時オブジェクトは削除されます。
これらのオブジェクト 1 つのスレッドから別に、常に送信渡すそれらのネイティブ処理を入力します。C++ のラップ オブジェクトを 1 つのスレッドからで渡す場合予期しない結果になります。
番号順テクニカル ノート|nbsp;カテゴリ別テクニカル ノート(&N)