次の方法で共有


コントロールがアクティブでないときのマウスとの対話

コントロールをすぐにアクティブにしない場合に、コントロールに固有のウィンドウがなくても、WM_SETCURSOR メッセージと WM_MOUSEMOVE メッセージをコントロールで処理できます。 この場合は、IPointerInactive インターフェイスの COleControl の実装を有効にします (既定では無効)。 IPointerInactive インターフェイスの詳細については、『ActiveX SDK』を参照してください。IPointerInactive インターフェイスを有効にするには、COleControl::GetControlFlags によって返される一連のフラグに pointerInactive フラグを含めます。

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


...


// The control can receive mouse notifications when inactive.
dwFlags |= pointerInactive;


...


   return dwFlags;
}

MFC ActiveX コントロール ウィザードでコントロールを作成するときに、[コントロールの設定] ページの [非アクティブ時のマウス ポインター通知] オプションを選択すると、このフラグを含めるコードが自動的に生成されます。

IPointerInactive インターフェイスが有効になっていると、コンテナーは、WM_SETCURSOR メッセージと WM_MOUSEMOVE メッセージを IPointerInactive インターフェイスに渡します。 IPointerInactive インターフェイスの COleControl の実装は、マウスの座標を適切に調整した後、コントロールのメッセージ マップを通じてメッセージをディスパッチします。 対応するエントリをメッセージ マップに追加すると、メッセージを通常のウィンドウ メッセージと同じように処理できます。 メッセージを処理するハンドラーで m_hWnd メンバー変数 (またはこのメンバー変数を使用するメンバー関数) を使用する場合は、値が NULL でないことを必ず事前に確認してください。

アクティブでないコントロールを OLE ドラッグ アンド ドロップ操作のターゲットにすることもできます。 この場合は、コントロールのウィンドウをドロップ ターゲットとして登録できるように、ユーザーがオブジェクトをコントロールにドラッグすると同時にコントロールをアクティブにする必要があります。 ドラッグ中にコントロールがアクティブになるようにするには、COleControl::GetActivationPolicy をオーバーライドして、POINTERINACTIVE_ACTIVATEONDRAG フラグを返します。

DWORD CMyAxOptCtrl::GetActivationPolicy()
{
   return POINTERINACTIVE_ACTIVATEONDRAG;
}

通常、IPointerInactive インターフェイスは、コントロールで常にマウス メッセージを処理できるようにする場合に有効にします。 IPointerInactive インターフェイスがコンテナーでサポートされていない場合は、コントロールが表示されている間はそのコントロールが常にアクティブになるようにする必要があります。そのためには、コントロールのその他のフラグの中に OLEMISC_ACTIVATEWHENVISIBLE フラグを含めます。 さらに、IPointerInactive をサポートしているコンテナーに対してこのフラグが影響を及ぼさないようにするには、OLEMISC_IGNOREACTIVATEWHENVISIBLE フラグも指定します。

static const DWORD BASED_CODE _dwMyOleMisc =
   OLEMISC_ACTIVATEWHENVISIBLE |
   OLEMISC_IGNOREACTIVATEWHENVISIBLE |
   OLEMISC_SETCLIENTSITEFIRST |
   OLEMISC_INSIDEOUT |
   OLEMISC_CANTLINKINSIDE |
   OLEMISC_RECOMPOSEONRESIZE;

参照

概念

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