Active ドキュメント
Active ドキュメントは、OLE の複合ドキュメント テクノロジを拡張します。 これらの拡張機能は、ビューを管理する追加のインターフェイスの形式で提供されます。これにより、オブジェクトをコンテナー内で機能させることができ、それと同時に表示と印刷の機能の制御も維持できます。 このプロセスにより、ドキュメントを外部フレーム (Microsoft Office バインダーや Microsoft Internet Explorer など) とネイティブ フレーム (製品独自のビュー ポートなど) の両方に表示できるようになります。
ここでは、Active ドキュメントの機能的な要件について説明します。 Active ドキュメントは、データのセットを所有し、データを保存および取得できるストレージにアクセスできます。 データに対して 1 つ以上のビューを作成および管理できます。 Active ドキュメントは、OLE ドキュメントの通常の埋め込みおよびインプレース アクティブ化インターフェイスをサポートするだけでなく、IOleDocument
を通じてビューを作成する機能を通知します。 コンテナーは、このインターフェイスから、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 ドキュメントには、このインターフェイスを持つビュー フレーム プロバイダーが必要です。 ドキュメントがコンテナー内に埋め込まれていない場合は、Active ドキュメント サーバー自体がビュー フレームを提供する必要があります。 ただし、Active ドキュメント が Active ドキュメント コンテナーに埋め込まれている場合、コンテナーにはビュー フレームが用意されています。
Active ドキュメントでは、そのデータの 1 つ以上の種類のビュー (通常、アウトライン、ページ レイアウトなど) を作成できます。 ビューは、データを選別して表示するフィルターのように機能します。 ドキュメントにビューの種類が 1 つしかない場合でも、新しいウィンドウ機能をサポートする手段として、複数のビューをサポートすることができます (Office アプリケーションの [ウィンドウ] メニューの [新しいウィンドウ] 項目など)。
Active ドキュメントの要件
Active ドキュメント コンテナーに表示できる Active ドキュメントには、次のような要件があります。
IPersistStorage
を実装することによって、OLE の複合ファイルをストレージ機構として使用します。OLE ドキュメントの基本的な埋め込み機能 (ファイルから作成など) をサポートします。 これは、インターフェイス
IPersistFile
、IOleObject
、IDataObject
を必要とします。1 つまたは複数のビューをサポートします。それぞれがインプレース アクティブ化に対応しています。 つまり、ビューはインターフェイス
IOleDocumentView
だけでなく、インターフェイスIOleInPlaceObject
とIOleInPlaceActiveObject
を (コンテナーのIOleInPlaceSite
とIOleInPlaceFrame
インターフェイスを使用して) サポートする必要があります。標準の Active ドキュメント インターフェイスである、
IOleDocument
、IOleCommandTarget
、IPrint
をサポートします。
コンテナー側のインターフェイスをいつどのように使用するかについての理解は、これらの要件で暗黙に示されます。
ビュー オブジェクトの要件
Active ドキュメントは、そのデータの 1 以上のビューを作成できます。 機能的には、これらのビューは、データを表示するための特定の方法のポートに似ています。 Active ドキュメントが単一のビューのみをサポートしている場合は、Active ドキュメントとその単一のビューを、単一のクラスを使用して実装できます。 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 ドキュメントがサポートするビューが単一である場合、Active ドキュメントとその単一のビューは、1 つの具象クラスを使用して実装できます。 IOleDocument::CreateView
は単に同じオブジェクトの IOleDocumentView
インターフェイス ポインターを返します。 つまり、1 つのビューのみが必要である場合は、2 つの異なるオブジェクト インスタンスを存在させる必要はありません。
ビュー オブジェクトもコマンド ターゲットにすることができます。 IOleCommandTarget
を実装することにより、ビューはコンテナーのユーザー インターフェイスで生成されたコマンドを受け取ることができます ([ファイル] メニューの [新規作成]、[開く]、[名前を付けて保存]、[印刷]、および [編集] の [コピー]、[貼り付け]、[元に戻す] など)。 詳細については、「メッセージ処理とコマンド ターゲット」をご覧ください。