Active ドキュメント コンテナー
Active ドキュメント コンテナー (Microsoft Office バインダーや Internet Explorer など) を使用すると、1 つのフレーム内でアプリケーションの種類が異なる複数のドキュメントを使用できます。そのため、ドキュメントの種類ごとにアプリケーション フレームを作成して複数のアプリケーション フレームを使用する必要はありません。
MFC では、COleDocObjectItem
クラスで Active ドキュメント コンテナーの完全なサポートを提供します。 MFC アプリケーション ウィザードを使用して Active ドキュメント コンテナーを作成するには、MFC アプリケーション ウィザードの [複合ドキュメント サポート] ページで [Active document container] (Active ドキュメント コンテナー) チェック ボックスをオンにします。 詳細については、「Active ドキュメント コンテナー アプリケーションの作成」を参照してください。
Active ドキュメント コンテナーの詳細については、以下を参照してください。
コンテナーの要件
Active ドキュメント コンテナーでの Active ドキュメントのサポートは、インターフェイスの実装以上のことを意味するため、含まれるオブジェクトのインターフェイスの使用に関する知識も必要になります。 同じことが Active ドキュメント拡張機能にも当てはまります。つまり、コンテナーは、Active ドキュメント自体でこれらの拡張インターフェイスを使用する方法も認識している必要があります。
Active ドキュメントを統合する Active ドキュメント コンテナーは、次の条件を満たしている必要があります。
IPersistStorage
インターフェイスを介してオブジェクト ストレージを処理できる必要があります。つまり、各 Active ドキュメントにIStorage
インスタンスを提供する必要があります。OLE ドキュメントの基本的な埋め込み機能をサポートする必要があります。つまり、
IOleClientSite
およびIAdviseSink
を実装する "サイト" オブジェクト (ドキュメントまたは埋め込みごとに 1 つ) が必要になります。埋め込みオブジェクトまたは Active ドキュメントのインプレース アクティブ化をサポートする必要があります。 コンテナーのサイト オブジェクトは
IOleInPlaceSite
を実装する必要があり、コンテナーのフレーム オブジェクトはIOleInPlaceFrame
を提供する必要があります。コンテナーがドキュメントと通信するためのメカニズムを提供する
IOleDocumentSite
を実装することにより、Active ドキュメントの拡張機能をサポートする必要があります。 オプションで、コンテナーは 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
を通じて提供される個別のアクティブ化および非アクティブ化サービスが各ビューに提供されます。
オブジェクトの構築
コンテナーのフレーム オブジェクトは、ほとんどの場合、OLE ドキュメントでのインプレース アクティブ化に使用されるのと同じフレームです。つまり、メニューとツール バーのネゴシエーションを処理するフレームです。 ビュー オブジェクトは、IOleInPlaceSite::GetWindowContext
を介してこのフレーム オブジェクトにアクセスできます。また、これによってコンテナー ドキュメントを表すコンテナー オブジェクトにアクセスすることもできます (ペインレベルのツール バー ネゴシエーションと、含まれているオブジェクトの列挙を処理できます)。
Active ドキュメント コンテナーは、IOleCommandTarget
を追加することでフレームを拡張できます。 これにより、Active ドキュメントのユーザー インターフェイスで発生したコマンドを、このインターフェイスでコンテナーが同じコマンド ([File New] (新規ファイル)、[開く]、[名前を付けて保存]、[印刷]、[Edit Copy] (コピーの編集)、[貼り付け]、[元に戻す] など) を Active ドキュメントに送信するのと同じ方法で受信できるようになります。 詳細については、コマンド ターゲットに関するページを参照してください。