次の方法で共有


非アクティブな状態でのマウス操作の提供

コントロールがすぐにアクティブ化されない場合でも、コントロールに独自のウィンドウがない場合でも、WM_SETCURSORおよびWM_MOUSEMOVEメッセージを処理したい場合があります。 これは、 COleControlIPointerInactive インターフェイスの実装を有効にすることで実現できます。これは既定で無効になっています。 (このインターフェイスの説明については、 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;

こちらも参照ください

MFC ActiveX コントロール: 最適化