コントロールがアクティブでないときのマウスとの対話
コントロールがすぐにアクティブ化されない場合は、コントロールが独自のウィンドウがない場合でも、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 コントロール ウィザードで作成すると コントロールの設定 ページの 非アクティブ時のマウス ポインター通知(M) オプションを選択すると生成されます。
IPointerInactive インターフェイスが有効な場合、コンテナーは、WM_SETCURSOR と WM_MOUSEMOVE メッセージに委任します。 IPointerInactive のCOleControl の実装はコントロールのメッセージ マップを通じてマウスの座標を適切に調整するとメッセージをディスパッチします。 メッセージ マップに対応するエントリを追加することによって、通常のウィンドウ メッセージなどのメッセージを処理できます。 これらのメッセージのハンドラーでは、最初に値が NULLでないことを確認するに m_hWnd のメンバー変数 (または、使用するメンバー関数) を使用しないでください。
またアクティブでないコントロールに 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;