インプレース アクティベーションの実装
インプレース アクティベーションにより、ユーザーはコンテナー ドキュメントから離れることなく、埋め込みオブジェクトを操作できるようになります。 ユーザーがオブジェクトをアクティブ化すると、コンテナー アプリケーションのメニュー バーとサーバー アプリケーションのメニュー バーの両方の要素で構成される複合メニュー バーが、コンテナーのメイン メニュー バーに置き換えられます。 したがって、アクティブなオブジェクトのコンテキスト依存ヘルプを含め、両方のアプリケーションのコマンドと機能をユーザーが利用できるようになります。 ユーザーがドキュメントの非オブジェクト部分の操作を開始すると、オブジェクトは非アクティブ化され、コンテナー ドキュメントの元のメニューが複合メニューを置き換えます。
この機能は、もともとインプレース編集の名前で行われました。 編集は、ユーザーが実行中のオブジェクトを操作するための 1 つの方法にすぎないため、名前が変更されました。 たとえば、サウンド クリップは編集の代わりに聞くことができます。 ビデオ クリップは編集の代わりに表示できます。 インプレース アクティベーションは、別のウィンドウを呼び出すことなくその場で実行できるため、ビデオ クリップの場合に特に適しています。 これは、ビデオをコンテナ ドキュメント内の隣接するテキスト データと組み合わせて表示する場合などに重要になる可能性があります。
インプレース アクティベーションの実装は、コンテナー アプリケーションとサーバー アプリケーションの両方で厳密にオプションです。 OLE は、オブジェクトをアクティブ化するとサーバー アプリケーションが別のウィンドウを開くモデルを引き続きサポートします。 リンクされたオブジェクトは、別のドキュメントに存在することを強調するために、常に別のウィンドウで開きます。
インプレース アクティブ化は、コンテナーからの IOleObject::DoVerb 呼び出しに応答して、オブジェクトから始まります。 この呼び出しは通常、ユーザーがオブジェクトをダブルクリックするか、コンテナー アプリケーションの [編集] メニューからコマンド (動詞) を選択することに応答して発生します。
インプレース ウィンドウは、埋め込みオブジェクトがアクティブな間、キーボードとマウスの入力を受け取ります。 ユーザーが複合メニュー バーからコマンドを選択すると、選択した特定のドロップダウン メニューの所有者に応じて、コマンドおよび関連するメニュー メッセージがコンテナ アプリケーションまたはオブジェクト アプリケーションに送信されます。 オブジェクトのルーラー、ツールバー、またはフレーム装飾による入力は、これらのウィンドウを所有する埋め込みオブジェクトに直接送られます。
インプレース アクティベーションされた埋め込みオブジェクトは、コンテナーがユーザー入力に応じて非アクティブ化するか、ビデオ クリップなどのようにオブジェクトが自発的にアクティブ状態を放棄するまで、アクティブのままです。 ユーザーは、コンテナー ドキュメント内でオブジェクトのインプレース アクティベーション ウィンドウの外側をクリックするか、単に別のオブジェクトをクリックすることによって、オブジェクトを非アクティブ化できます。 ただし、ユーザーがコンテナのタイトル バー、スクロール バー、または特にメニュー バーをクリックした場合、インプレース アクティベーションされたオブジェクトはアクティブなままになります。
インプレース アクティベーション オブジェクト サーバーは、インプロセス サーバー (DLL) またはローカル サーバー (EXE) として実装できます。 どちらの場合も、複合メニュー バーには、サーバー プロセスとコンテナー プロセスの両方からの項目 (通常はドロップダウン メニュー) が含まれます。 インプロセス サーバーの場合、インプレース アクティベーション ウィンドウは、コンテナーのウィンドウ階層内の単なる別の子ウィンドウであり、コンテナー アプリケーションのメッセージ ポンプを通じて入力を受け取ります。
ローカル サーバーの場合、インプレース アクティベーション ウィンドウは埋め込みオブジェクトのサーバー アプリケーション プロセスに属しますが、その親ウィンドウはコンテナーに属します。 インプレース アクティベーション ウィンドウへの入力はサーバーのメッセージ キューに表示され、サーバーのメッセージ ループによってディスパッチされます。 OLE ライブラリは、メニュー コマンドとメッセージが正しく送出されるようにする責任があります。
関連トピック