Aktive Dokumente

Aktive Dokumente erweitern die Verbunddokumenttechnologie von OLE. Diese Erweiterungen werden in Form zusätzlicher Schnittstellen bereitgestellt, die Ansichten verwalten, sodass Objekte innerhalb von Containern funktionieren und dennoch die Kontrolle über ihre Anzeige- und Druckfunktionen behalten können. Mit diesem Prozess können Dokumente sowohl in Fremdframes (z. B. microsoft Office Binder oder Microsoft Internet Explorer) als auch in systemeigenen Frames (z. B. den eigenen Ansichtsports des Produkts) angezeigt werden.

In diesem Abschnitt werden die funktionalen Anforderungen für aktive Dokumente beschrieben. Das aktive Dokument besitzt eine Datenmenge und hat Zugriff auf den Speicher, an dem die Daten gespeichert und abgerufen werden können. Sie kann eine oder mehrere Ansichten ihrer Daten erstellen und verwalten. Zusätzlich zur Unterstützung der üblichen Einbettungs- und In-Place-Aktivierungsschnittstellen von OLE-Dokumenten kommuniziert das aktive Dokument seine Fähigkeit, Ansichten durch IOleDocumentzu erstellen. Über diese Schnittstelle kann der Container die Ansichten erstellen (und möglicherweise aufzählen), die das aktive Dokument anzeigen kann. Über diese Schnittstelle kann das aktive Dokument auch verschiedene Informationen über sich selbst bereitstellen, z. B. ob es mehrere Ansichten oder komplexe Rechtecke unterstützt.

Es folgt die IOleDocument Schnittstelle. Beachten Sie, dass es sich bei der IEnumOleDocumentViews Schnittstelle um einen standardmäßigen OLE-Enumerator für IOleDocumentView* Typen handelt.

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);
    }

Jedes aktive Dokument muss über einen Ansichtsrahmenanbieter mit dieser Schnittstelle verfügen. Wenn das Dokument nicht in einen Container eingebettet ist, muss der aktive Dokumentserver selbst den Ansichtsrahmen bereitstellen. Wenn das aktive Dokument jedoch in einen aktiven Dokumentcontainer eingebettet ist, stellt der Container den Ansichtsrahmen bereit.

Ein aktives Dokument kann einen oder mehrere Arten von Ansichten seiner Daten erstellen (z. B. normal, Gliederung, Seitenlayout usw.). Ansichten wirken wie Filter, durch die die Daten angezeigt werden können. Auch wenn das Dokument nur einen Ansichtstyp aufweist, möchten Sie möglicherweise immer noch mehrere Ansichten unterstützen, um neue Fensterfunktionen zu unterstützen (z. B. das Element "Neues Fenster" im Menü "Fenster" in Office-App lications).

Anforderungen für aktive Dokumente

Ein aktives Dokument, das in einem aktiven Dokumentcontainer angezeigt werden kann, muss:

  • Verwenden Sie die zusammengesetzten OLE-Dateien als Speichermechanismus, indem Sie diese implementieren IPersistStorage.

  • Unterstützen Sie die grundlegenden Einbettungsfeatures von OLE-Dokumenten, einschließlich "Aus Datei erstellen". Dies erfordert die Schnittstellen IPersistFile, IOleObjectund IDataObject.

  • Unterstützen Sie eine oder mehrere Ansichten, von denen jede in der Lage ist, eine direkte Aktivierung zu ermöglichen. Das heißt, die Ansichten müssen die Schnittstelle IOleDocumentView sowie die Schnittstellen IOleInPlaceObjectIOleInPlaceActiveObject und (mit den Containern IOleInPlaceSite und IOleInPlaceFrame Schnittstellen) unterstützen.

  • Unterstützen Sie die standardmäßigen aktiven Dokumentschnittstellen IOleDocument, IOleCommandTargetund IPrint.

Kenntnisse darüber, wann und wie die containerseitigen Schnittstellen verwendet werden, werden in diesen Anforderungen impliziert.

Anforderungen für Ansichtsobjekte

Ein aktives Dokument kann eine oder mehrere Ansichten seiner Daten erstellen. Funktionell sind diese Ansichten wie Ports zu einer bestimmten Methode zum Anzeigen der Daten. Wenn ein aktives Dokument nur eine einzelne Ansicht unterstützt, kann das aktive Dokument und diese einzelne Ansicht mithilfe einer einzelnen Klasse implementiert werden. IOleDocument::CreateView gibt den Schnittstellenzeiger desselben IOleDocumentView Objekts zurück.

Um in einem aktiven Dokumentcontainer dargestellt zu werden, muss IOleInPlaceObjectIOleInPlaceActiveObject eine Ansichtskomponente zusätzlich zu IOleDocumentView:

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);
    }

Jede Ansicht verfügt über eine zugeordnete Ansichtswebsite, die den Ansichtsrahmen und den Ansichtsport (HWND und einen rechteckigen Bereich in diesem Fenster) kapselt. Die Website macht diese Funktionalität zwar über die Standardschnittstelle IOleInPlaceSite verfügbar. Beachten Sie, dass es möglich ist, mehrere Ansichtsports für einen einzelnen HWND zu verwenden.

In der Regel weist jeder Ansichtstyp eine andere gedruckte Darstellung auf. Daher sollten Ansichten und die entsprechenden Ansichtswebsites die Druckschnittstellen implementieren, wenn IPrint bzw IContinueCallback. Der Ansichtsrahmen muss beim Drucken mit dem Ansichtsanbieter IPrint verhandeln, sodass Kopfzeilen, Fußzeilen, Ränder und verwandte Elemente korrekt gedruckt werden. Der Ansichtsanbieter benachrichtigt den Frame von druckbezogenen Ereignissen über IContinueCallback. Weitere Informationen zur Verwendung dieser Schnittstellen finden Sie unter Programmatic Printing.

Beachten Sie, dass, wenn ein aktives Dokument nur eine einzelne Ansicht unterstützt, das aktive Dokument und diese einzelne Ansicht mithilfe einer einzelnen konkreten Klasse implementiert werden können. IOleDocument::CreateView gibt einfach den Schnittstellenzeiger desselben IOleDocumentView Objekts zurück. Kurz gesagt, es ist nicht erforderlich, dass zwei separate Objektinstanzen vorhanden sind, wenn nur eine Ansicht erforderlich ist.

Ein Ansichtsobjekt kann auch ein Befehlsziel sein. Durch die Implementierung IOleCommandTarget einer Ansicht können Befehle empfangen, die auf der Benutzeroberfläche des Containers stammen (z. B. "Neu", "Öffnen", "Speichern unter", "Drucken" im Menü "Datei" und "Kopieren", "Einfügen", "Rückgängig" im Menü "Bearbeiten"). Weitere Informationen finden Sie unter Nachrichtenverarbeitung und Befehlsziele.

Siehe auch

Aktive Dokumente-Container