Active ドキュメント コンテナ
更新 : 2007 年 11 月
Microsoft Office バインダーや Internet Explorer などの Active ドキュメント コンテナでは、アプリケーションの種類が異なる複数のドキュメントを 1 つのフレームで操作できます。つまり、ドキュメント タイプごとにアプリケーション フレームを作成したり、使い分ける必要はありません。
MFC では、COleDocObjectItem クラスで、Active ドキュメント コンテナを完全にサポートしています。MFC アプリケーション ウィザードで Active ドキュメント コンテナを作成するには、[複合ドキュメント サポート] ページの [アクティブ ドキュメント コンテナ] チェック ボックスをオンにします。詳細については、「Active ドキュメント コンテナ アプリケーションの作成」を参照してください。
Active ドキュメント コンテナの詳細については、次のトピックを参照してください。
コンテナの必要条件
ドキュメント サイト オブジェクト
ビュー サイト オブジェクト
Frame オブジェクト
コンテナの必要条件
Active ドキュメント コンテナでの Active ドキュメントのサポートでは、インターフェイスの実装だけではなく、埋め込みオブジェクトのインターフェイスが使用できることも必要です。同様に、Active ドキュメントの拡張機能でも、コンテナが Active ドキュメント上でこの拡張インターフェイスを使用できることが必要です。
Active ドキュメントを統合する Active ドキュメント コンテナは、次の条件を満たす必要があります。
IPersistStorage インターフェイスを使用してオブジェクト ストレージを処理できること。アクティブ ドキュメントごとに IStorage のインスタンスが必要です。
OLE ドキュメントの基本的な埋め込み機能をサポートしていること。ドキュメントまたは埋め込みごとに、IOleClientSite および IAdviseSink を実装した "サイト" オブジェクトが 1 つ必要です。
埋め込みオブジェクトまたは Active ドキュメントの埋め込み先編集の有効化をサポートしていること。コンテナのサイト オブジェクトで IOleInPlaceSite を実装し、コンテナのフレーム オブジェクトで IOleInPlaceFrame を提供する必要があります。
Active ドキュメントの拡張機能をサポートしていること。コンテナがドキュメントに指示できるよう、IOleDocumentSite を実装する必要があります。コンテナに Active ドキュメント インターフェイスの IOleCommandTarget および IContinueCallback を実装し、印刷や保存などの単純なコマンドを受け取るようにすることもできます。
フレーム オブジェクト、ビュー オブジェクト、およびコンテナ オブジェクトで IOleCommandTarget を実装し、特定のコマンドのディスパッチをサポートすることもできます (「メッセージ処理とコマンド ターゲット」を参照)。ビュー オブジェクトとコンテナ オブジェクトで IPrint と IContinueCallback を実装し、プログラムによる印刷をサポートすることもできます (「プログラムによる印刷」を参照)。
次の図は、コンテナとそのコンポーネントの関係 (左側) および Active ドキュメントとそのビューの関係 (右側) を概念的に示したものです。この図の Active ドキュメントはストレージとデータを管理し、ビューはそのデータの表示や印刷を行います。太字のインターフェイスは、Active ドキュメントに必要なインターフェイスです。太字で斜体のインターフェイスはオプションです。その他のインターフェイスは必須です。
1 つのビューしかサポートしていないドキュメントでも、ビュー コンポーネントとドキュメント コンポーネント (つまり、対応するインターフェイス) を 1 つの具象クラスで実装できます。また、一度に 1 つのビューしかサポートしないコンテナ サイトは、ドキュメント サイトとビュー サイトを 1 つの具象サイト クラスに統合できます。ただし、コンテナのフレーム オブジェクトは別のものとして扱う必要があります。コンテナのドキュメント コンポーネントは、ここでは単にアーキテクチャの全体像を示すために使用されています。コンテナのこの部分は、Active ドキュメント コンテインメント アーキテクチャの影響は受けません。
ドキュメント サイト オブジェクト
Active ドキュメント コンテインメント アーキテクチャのドキュメント サイトは、OLE ドキュメントのクライアント サイト オブジェクトに、次の IOleDocument インターフェイスを追加したものです。
interface IOleDocumentSite : IUnknown
{
HRESULT ActivateMe(IOleDocumentView *pViewToActivate);
}
ドキュメント サイトは、概念的には 1 つ以上の "ビュー サイト" オブジェクトのコンテナと考えることができます。各ビュー サイト オブジェクトは、ドキュメント サイトが管理しているドキュメントの各ビュー オブジェクトに対応しています。コンテナがドキュメント サイトごとに 1 つのビューしかサポートしていない場合は、1 つの具象クラスでドキュメント サイトとビュー サイトを実装できます。
ビュー サイト オブジェクト
コンテナのビュー サイト オブジェクトは、ドキュメントの特定のビューの表示領域を管理します。ビュー サイトは、標準の IOleInPlaceSite インターフェイスをサポートするだけではなく、一般に、プログラムで印刷を制御するための IContinueCallback も実装します。ビュー オブジェクトは、IContinueCallback を問い合わせることはないので、実際にはコンテナが必要としているどのオブジェクトにも実装できます。
複数のビューをサポートするコンテナは、ドキュメント サイト内に複数のビュー サイト オブジェクトを作成できる必要があります。これにより、IOleInPlaceSite を使用した場合と同じように、各ビューにそれぞれ個別にアクティブ化サービスおよび非アクティブ化サービスを提供できます。
Frame オブジェクト
コンテナのフレーム オブジェクトは、OLE ドキュメントの埋め込み先編集の有効化に使用されるフレームとよく似ています。つまり、メニューとツール バーのネゴシエーションを行います。ビュー オブジェクトは、IOleInPlaceSite::GetWindowContext を使用して、このフレーム オブジェクトにアクセスします。また、このインターフェイスは、コンテナ ドキュメント (ペイン レベルのツール バーのネゴシエーションや埋め込みオブジェクトの列挙を行う) を表すコンテナ オブジェクトへのアクセスにも使用されます。
Active ドキュメント コンテナでは、IOleCommandTarget を追加するとにより、フレーム機能を拡張できます。つまり、コンテナがアクティブ ドキュメントのユーザー インターフェイスを使用して実行されたコマンドを受け取ることができます。これは、このインターフェイスを使用して、コンテナが同じコマンド ([ファイル] メニューの [新規作成]、[開く]、[名前を付けて保存]、[印刷]、[編集] メニューの [コピー]、[貼り付け]、[元に戻す] など) をアクティブ ドキュメントに送るのと同じ方法で行われます。詳細については、「メッセージ処理とコマンド ターゲット」を参照してください。