次の方法で共有


ウィンドウなしのアクティベーション

CreateWindowをダイヤルするときのペインの作成はコード (すべて)実行するには大きな負担です。画面上のペインを保持するコントロールはウィンドウのメッセージを管理する必要があります。したがって、ウィンドウなしのコントロールは、ペインを持つコントロールよりもあります。

ウィンドウなしのコントロールの長所は、ウィンドウのコントロールとは異なり、ウィンドウなしのコントロールが透明描画とオン画面領域をサポートします。透過的なコントロールの一般的な例は透明な背景のテキスト コントロールです。コントロールは、テキスト背景を塗りつぶしますそのため、データはすべてテキスト表示の下にあります。新しいフォームは、矢印、および角の丸いボタンなどのコントロール、次を使用します。

多くの場合、代わりに、コントロールはウィンドウなしのオブジェクトをサポートするためにコンテナーが書き込まれたら独自のペインを必要とせず、コンテナー ペインのサービスを使用できません。ウィンドウなしのコントロールは、古いコンテナーと下位互換性があります。サポート ウィンドウなしのコントロールに書き込まれない古いコンテナーではウィンドウなしのコントロールはウィンドウは、アクティブ作成します。

ウィンドウなしのコントロールが独自のペインがないため、 (ペインのある)コンテナー コントロールの独自のウィンドウで他には、指定されたサービスを提供する必要があります。たとえば、キーボード フォーカスを呼び出すか、マウスをキャプチャされるか、またはデバイス コンテキストを取得するコントロールの描画がコンテナーによってこれらの操作管理されます。コンテナーは、適切なウィンドウなしのコントロールに IOleInPlaceObjectWindowless インターフェイスを使用してウィンドウに送信されるユーザー入力のメッセージのパスを指定します。(このインターフェイスの詳細については 、 ActiveX SDK を 参照してください)。 COleControl のメンバー関数コンテナーからこれらのサービスを呼び出すため。

コントロールがウィンドウなしのアクティベーションを使用します COleControl::GetControlFlagsによって返されるフラグの設定に windowlessActivate のフラグを含めます。次に例を示します。

DWORD CMyAxOptCtrl::GetControlFlags()
{
   DWORD dwFlags = COleControl::GetControlFlags();


...


// The control can activate without creating a window.
dwFlags |= windowlessActivate;


...


   return dwFlags;
}

このフラグが含まれるコードは自動的に MFC ActiveX コントロール ウィザードの コントロール設定 のページの Windowless activation オプションを選択した場合に生成されます。

ウィンドウなしのアクティベーションが有効な場合、コンテナーは、コントロールの IOleInPlaceObjectWindowless インターフェイスにメッセージを送信するに委任します。entity_CODECOleControl、このインターフェイスの実装は、コントロールのメッセージ マップを通じてマウスの座標を適切に調整すると、メッセージをディスパッチします。メッセージ マップに対応するエントリを追加して、通常のウィンドウ メッセージなどのメッセージを処理できます。これらのメッセージのハンドラーでは、値が NULLでは、最初にチェック アウトせずに m_hWnd のメンバー変数 (または、使用するメンバー関数)を使用しないでください。

COleControl 必要に応じて、コンテナーからマウスのキャプチャ、キーボード フォーカス、スクロールおよび他のペインのサービスを呼び出す次のようなメンバー関数を提供します:

ウィンドウなしのコントロールでは、 CWnd の対応するメンバー関数または関連の Win32 API 関数の代わりに COleControl のメンバー関数を必ず使用する必要があります。

ウィンドウなしのコントロールに OLE ドラッグ アンド ドロップ操作のターゲットにすることができます。通常、これは、コントロール ウィンドウがドロップ ターゲットとして登録されている必要があります。コントロールで独自のペインがないため、コンテナーはドロップ ターゲットとして独自のウィンドウを使用します。コントロールは、コンテナーが適切なタイミングで呼び出しに代入できる IDropTarget インターフェイスの実装を提供します。このインターフェイスをコンテナーに公開するには、オーバーライド COleControl::GetWindowlessDropTarget。次に例を示します。

IDropTarget* CMyAxOptCtrl::GetWindowlessDropTarget()
{
   m_DropTarget.m_xDropTarget.AddRef();
   return &m_DropTarget.m_xDropTarget;
}

参照

概念

MFC ActiveX コントロール : 最適化