Active ドキュメント
Active ドキュメントは、OLE の複合ドキュメント テクノロジーを拡張したものです。 拡張機能として、ビュー管理用のインターフェイスが追加されています。これにより、コンテナー内でオブジェクトを操作できるばかりでなく、オブジェクト自体の表示機能や印刷機能も従来どおり制御できます。 つまり、ドキュメントを Microsoft Office バインダーや Internet Explorer などの外部フレームに表示することも、製品固有のビュー ポートなどのネイティブ フレームに表示することもできます。
ここでは、機能に関する Active ドキュメントの必要条件について説明します。 Active ドキュメントはデータセットを保有し、ストレージにアクセスしてそのデータを保存したり取得できます。 データに対し、1 つ以上ビューを作成して管理することもできます。 Active ドキュメントでは、OLE ドキュメントの標準の埋め込みインターフェイスと埋め込み先編集の有効化インターフェイスのほか、ビューを作成する IOleDocument インターフェイスもサポートされています。 コンテナーはこのインターフェイスを使用して、Active ドキュメントで表示するビューの作成 (場合によっては列挙) を要求できます。 Active ドキュメントはこのインターフェイスを使用して、複数のビューや複合四角形をサポートするかどうかなど、Active ドキュメント自体に関するさまざまな情報を提供します。
次に示すのは、IOleDocument インターフェイスのコードです。 IEnumOleDocumentViews インターフェイスは、IOleDocumentView * 型の標準的な OLE 列挙子です。
interface IOleDocument : IUnknown
{
HRESULT CreateView(
[in] IOleInPlaceSite *pIPSite,
[in] IStream *pstm,
[in] DWORD dwReserved,
[out] IOleDocumentView **ppView);
HRESULT GetDocMiscStatus([out] DWORD *pdwStatus);
HRESULT EnumViews(
[out] IEnumOleDocumentViews **ppEnum,
[out] IOleDocumentView **ppView);
}
各 Active ドキュメントには、IOleDocument を持つビュー フレーム プロバイダーが必要です。 Active ドキュメントがコンテナーに埋め込まれていない場合は、Active ドキュメント サーバーがビュー フレームを提供する必要があります。 Active ドキュメントが Active ドキュメント コンテナーに埋め込まれている場合は、コンテナーがビュー フレームを提供します。
Active ドキュメントは、標準、アウトライン、ページ レイアウトなどの異なる種類のデータのビューを作成できます。 ビューは、データを表示するときのフィルターのように機能します。 ドキュメントが 1 種類のビューしかサポートしていない場合でも、新しいウィンドウ機能を実現するための手段として、複数のビューのサポートが必要な場合があります。たとえば、Office アプリケーションの [ウィンドウ] メニューの [新しいウィンドウを開く] のような機能を使用する場合などです。
Active ドキュメントの必要条件
Active ドキュメントを Active ドキュメント コンテナーに表示するには、次の条件を満たす必要があります。
ストレージ機構として、OLE の複合ファイルを使用すること。IPersistStorage を実装する必要があります。
[ファイルから(作成)] などの OLE ドキュメントの基本的な埋め込み機能をサポートしていること。 IPersistFile、IOleObject および IDataObject の各インターフェイスが必要です。
埋め込み先編集の有効化が可能なビューを 1 つ以上サポートしていること。 各ビューは、IOleInPlaceObject インターフェイスおよび IOleInPlaceActiveObject インターフェイス (コンテナーの IOleInPlaceSite インターフェイスおよび IOleInPlaceFrame インターフェイスを使用) のほか、IOleDocumentView インターフェイスをサポートする必要があります。
Active ドキュメントの標準インターフェイス IOleDocument、IOleCommandTarget、および IPrint をサポートしていること。
以上の条件を満たすと、コンテナー側インターフェイスをいつどのように使用するかに関する情報が暗黙で指定されます。
ビュー オブジェクトの必要条件
Active ドキュメントでは、データに対して複数の種類のビューを作成できます。 これらのビューは、データを表示するための特定のメソッドへのポートとして機能します。 Active ドキュメントが 1 つのビューしかサポートしない場合は、Active ドキュメントとビューを 1 つのクラスで実装できます。 この場合、IOleDocument::CreateView は、同じオブジェクトの IOleDocumentView インターフェイス ポインターを返します。
Active ドキュメント コンテナーに表示するビュー コンポーネントは、次の IOleDocumentView インターフェイスのほかに、IOleInPlaceObject インターフェイスと IOleInPlaceActiveObject インターフェイスをサポートする必要があります。
interface IOleDocumentView : IUnknown
{
HRESULT SetInPlaceSite([in] IOleInPlaceSite *pIPSite);
HRESULT GetInPlaceSite([out] IOleInPlaceSite **ppIPSite);
HRESULT GetDocument([out] IUnknown **ppunk);
[input_sync] HRESULT SetRect([in] LPRECT prcView);
HRESULT GetRect([in] LPRECT prcView);
[input_sync] HRESULT SetRectComplex(
[in] LPRECT prcView,
[in] LPRECT prcHScroll,
[in] LPRECT prcVScroll,
[in] LPRECT prcSizeBox);
HRESULT Show([in] BOOL fShow);
HRESULT UIActivate([in] BOOL fUIActivate);
HRESULT Open(void);
HRESULT CloseView([in] DWORD dwReserved);
HRESULT SaveViewState([in] IStream *pstm);
HRESULT ApplyViewState([in] IStream *pstm);
HRESULT Clone(
[in] IOleInPlaceSite *pIPSiteNew,
[out] IOleDocumentView **ppViewNew);
}
各ビューにはそれぞれに対応するビュー サイトがあり、ビュー サイトはビュー フレームとビュー ポート (HWND とこのウィンドウ内の四角形の領域) をカプセル化します。 ビュー サイトは、標準の IOleInPlaceSite インターフェイスを使用してこの機能を公開します。 1 つの HWND で複数のビュー ポートを持つこともできます。
通常、ビューの種類によって印刷結果は異なります。 そのため、ビューとそのビュー サイトのそれぞれに、印刷インターフェイスとして、IPrint と IContinueCallback を実装する必要があります。 ビュー フレームは、ヘッダー、フッター、余白などの要素が正しく印刷されるように、印刷の開始時に IPrint を使用してビュー プロバイダーとネゴシエートします。 ビュー プロバイダーは IContinueCallback を使用して、印刷関連イベントをフレームに通知します。 これらのインターフェイスの使い方の詳細については、「プログラムによる印刷」を参照してください。
Active ドキュメントがサポートするビューが 1 つだけの場合は、Active ドキュメントとこのビューを 1 つの具象クラスで実装できます。 この場合、IOleDocument::CreateView は、同じオブジェクトの IOleDocumentView インターフェイス ポインターを返すだけです。 つまり、必要なビューが 1 つだけの場合は、オブジェクトのインスタンスも 1 つで十分です。
ビュー オブジェクトをコマンド ターゲットにすることもできます。 IOleCommandTarget を実装することで、ビューは、コンテナーのユーザー インターフェイスで発生したコマンド ([ファイル] メニューの [新規作成]、[開く]、[名前を付けて保存]、[印刷]、[編集] メニューの [コピー]、[貼り付け]、[元に戻す] など) を受け取ることができます。 詳細については、「メッセージ処理とコマンド ターゲット」を参照してください。