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