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 ドキュメントの基本的な埋め込み機能 (ファイルから作成など) をサポートします。 これは、インターフェイス IPersistFileIOleObjectIDataObject を必要とします。

  • 1 つまたは複数のビューをサポートします。それぞれがインプレース アクティブ化に対応しています。 つまり、ビューはインターフェイス IOleDocumentView だけでなく、インターフェイス IOleInPlaceObjectIOleInPlaceActiveObject を (コンテナーの IOleInPlaceSiteIOleInPlaceFrame インターフェイスを使用して) サポートする必要があります。

  • 標準の Active ドキュメント インターフェイスである、IOleDocumentIOleCommandTargetIPrint をサポートします。

コンテナー側のインターフェイスをいつどのように使用するかについての理解は、これらの要件で暗黙に示されます。

ビュー オブジェクトの要件

Active ドキュメントは、そのデータの 1 以上のビューを作成できます。 機能的には、これらのビューは、データを表示するための特定の方法のポートに似ています。 Active ドキュメントが単一のビューのみをサポートしている場合は、Active ドキュメントとその単一のビューを、単一のクラスを使用して実装できます。 IOleDocument::CreateView は同じオブジェクトの IOleDocumentView インターフェイス ポインターを返します。

Active ドキュメント コンテナー内で表示するには、ビュー コンポーネントで IOleDocumentView に加え、IOleInPlaceObjectIOleInPlaceActiveObject をサポートする必要があります。

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 を実装することにより、ビューはコンテナーのユーザー インターフェイスで生成されたコマンドを受け取ることができます ([ファイル] メニューの [新規作成][開く][名前を付けて保存][印刷]、および [編集][コピー][貼り付け][元に戻す] など)。 詳細については、「メッセージ処理とコマンド ターゲット」をご覧ください。

関連項目

Active ドキュメント コンテインメント