Dela via


Aktiva dokument

Aktiva dokument utökar den sammansatta dokumenttekniken för OLE. Dessa tillägg tillhandahålls i form av ytterligare gränssnitt som hanterar vyer, så att objekt kan fungera i containrar och ändå behålla kontrollen över sina visnings- och utskriftsfunktioner. Den här processen gör det möjligt att visa dokument både i externa ramar (till exempel Microsoft Office Binder eller Microsoft Internet Explorer) och i interna ramar (till exempel produktens egna visningsportar).

I det här avsnittet beskrivs funktionskraven för aktiva dokument. Det aktiva dokumentet äger en uppsättning data och har åtkomst till lagring där data kan sparas och hämtas. Den kan skapa och hantera en eller flera vyer på sina data. Förutom att stödja de vanliga inbäddnings- och aktiveringsgränssnitten för OLE-dokument kommunicerar det aktiva dokumentet sin förmåga att skapa vyer via IOleDocument. Via det här gränssnittet kan containern be om att skapa (och eventuellt räkna upp) de vyer som det aktiva dokumentet kan visa. Med det här gränssnittet kan det aktiva dokumentet också ge diverse information om sig själv, till exempel om det stöder flera vyer eller komplexa rektanglar.

Följande är gränssnittet IOleDocument . Observera att IEnumOleDocumentViews gränssnittet är en standard-OLE-uppräknare för IOleDocumentView* typer.

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

Varje aktivt dokument måste ha en visningsramprovider med det här gränssnittet. Om dokumentet inte är inbäddat i en container måste den aktiva dokumentservern själv ange vyramen. Men när det aktiva dokumentet är inbäddat i en aktiv dokumentcontainer tillhandahåller containern vyramen.

Ett aktivt dokument kan skapa en eller flera typer av vyer av sina data (till exempel normal, disposition, sidlayout och så vidare). Vyer fungerar som filter genom vilka data kan ses. Även om dokumentet bara har en typ av vy kanske du fortfarande vill ha stöd för flera vyer som ett sätt att stödja nya fönsterfunktioner (till exempel objektet Nytt fönstermenyn Fönster i Office-program).

Krav för aktiva dokument

Ett aktivt dokument som kan visas i en aktiv dokumentcontainer måste:

  • Använd OLE:s Sammansatta filer som lagringsmekanism genom att implementera IPersistStorage.

  • Stöd för grundläggande inbäddningsfunktioner i OLE-dokument, inklusive Skapa från fil. Detta kräver gränssnitten IPersistFile, IOleObjectoch IDataObject.

  • Stöd för en eller flera vyer som var och en kan aktiveras på plats. Vyerna måste alltså ha stöd för gränssnittet IOleDocumentView samt gränssnitten IOleInPlaceObject och IOleInPlaceActiveObject (med hjälp av containerns IOleInPlaceSite och IOleInPlaceFrame gränssnitten).

  • Stöd för de aktiva standarddokumentgränssnitten IOleDocument, IOleCommandTargetoch IPrint.

Kunskap om när och hur du använder gränssnitten på containersidan är underförstått i dessa krav.

Krav för visningsobjekt

Ett aktivt dokument kan skapa en eller flera vyer av sina data. Funktionellt är dessa vyer som portar på en viss metod för att visa data. Om ett aktivt dokument bara stöder en enda vy kan det aktiva dokumentet och den enskilda vyn implementeras med hjälp av en enda klass. IOleDocument::CreateView returnerar samma objekts gränssnittspekare IOleDocumentView .

För att representeras i en aktiv dokumentcontainer måste en vykomponent stödja IOleInPlaceObject och IOleInPlaceActiveObject utöver 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);
    }

Varje vy har en associerad vywebbplats som kapslar in vyramen och vyporten (HWND och ett rektangulärt område i fönstret). Webbplatsen exponerar den här funktionen via standardgränssnittet IOleInPlaceSite . Observera att det är möjligt att ha mer än en visningsport på en enda HWND.

Vanligtvis har varje typ av vy en annan tryckt representation. Därför bör vyer och motsvarande visningsplatser implementera utskriftsgränssnitten om IPrintIContinueCallbackrespektive . Vyramen måste förhandla med vyprovidern genom IPrint när utskriften börjar, så att sidhuvuden, sidfötter, marginaler och relaterade element skrivs ut korrekt. Vyprovidern meddelar ramen för utskriftsrelaterade händelser via IContinueCallback. Mer information om hur du använder dessa gränssnitt finns i Programmatisk utskrift.

Observera att om ett aktivt dokument bara stöder en enda vy kan det aktiva dokumentet och den enskilda vyn implementeras med hjälp av en enda betongklass. IOleDocument::CreateView returnerar helt enkelt samma objekts gränssnittspekare IOleDocumentView . Kort och kort är det inte nödvändigt att det finns två separata objektinstanser när endast en vy krävs.

Ett visningsobjekt kan också vara ett kommandomål. Genom att implementera IOleCommandTarget en vy kan ta emot kommandon som kommer från containerns användargränssnitt (till exempel Nytt, Öppna, Spara som, Skriv utArkiv-menyn och Kopiera, Klistra in, Ångrapå redigera-menyn ). Mer information finns i Meddelandehantering och Kommandomål.

Se även

Aktiv dokumentinnehållning