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