コントロールがアクティブでないときのマウスとの対話
コントロールをすぐにアクティブにしない場合に、コントロールに固有のウィンドウがなくても、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;