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

コントロールがすぐにアクティブ化されず、コントロールに独自のウィンドウがない場合でも、WM_SETCURSOR および WM_MOUSEMOVE メッセージを処理したいことがあります。 これを実現するには、IPointerInactive インターフェイスの COleControl の実装を有効にします。これは、既定では無効になっています (〘 このインターフェイスの説明については、ActiveX SDK を参照してください)。)これを有効にするには、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 メッセージをそのインターフェイスに委任します。 COleControl (IPointerInactive) の実装では、マウスの座標を適切に調整した後、コントロールのメッセージ マップを通じてメッセージをディスパッチします。 通常のウィンドウ メッセージのようにメッセージを処理するには、対応するエントリをメッセージ マップに追加します。 これらのメッセージのハンドラーでは、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 コントロール: 最適化