Aktivní dokumenty
Aktivní dokumenty rozšiřují složenou technologii dokumentů OLE. Tato rozšíření jsou poskytována ve formě dalších rozhraní, která spravují zobrazení, aby objekty mohly fungovat v kontejnerech a přesto si zachovaly kontrolu nad jejich funkcemi zobrazení a tisku. Tento proces umožňuje zobrazit dokumenty jak v cizích rámcích (například systém Microsoft Office Binder nebo Microsoft Internet Explorer), tak v nativních rámcích (jako jsou vlastní porty zobrazení produktu).
Tato část popisuje funkční požadavky pro aktivní dokumenty. Aktivní dokument vlastní sadu dat a má přístup k úložišti, kde se dají data ukládat a načítat. Může vytvářet a spravovat jedno nebo více zobrazení svých dat. Kromě podpory obvyklých vkládání a místních aktivačních rozhraní dokumentů OLE aktivní dokument komunikuje svou schopnost vytvářet zobrazení prostřednictvím IOleDocument
. Prostřednictvím tohoto rozhraní může kontejner požádat o vytvoření (a případně vytvoření výčtu) zobrazení, která může aktivní dokument zobrazit. Prostřednictvím tohoto rozhraní může aktivní dokument také poskytovat různé informace o sobě, například zda podporuje více zobrazení nebo složitých obdélníků.
Toto rozhraní je následující IOleDocument
. Všimněte si, že IEnumOleDocumentViews
rozhraní je standardní enumerátor OLE pro IOleDocumentView*
typy.
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);
}
Každý aktivní dokument musí mít s tímto rozhraním zprostředkovatele rámce zobrazení. Pokud dokument není vložený do kontejneru, musí samotný aktivní server dokumentů poskytnout rámec zobrazení. Pokud je však aktivní dokument vložen do kontejneru aktivního dokumentu, kontejner poskytuje rámec zobrazení.
Aktivní dokument může vytvořit jeden nebo více typů zobrazení svých dat (například normální, osnova, rozložení stránky atd.). Zobrazení fungují jako filtry, pomocí kterých se data dají zobrazit. I když má dokument jenom jeden typ zobrazení, můžete stále chtít podporovat více zobrazení jako prostředek podpory nových funkcí okna (například položku Nové okno v nabídce Okno v aplikace Office lications).
Požadavky na aktivní dokumenty
Aktivní dokument, který se dá zobrazit v aktivním kontejneru dokumentů, musí:
Použití složeného souboru OLE jako svého úložného mechanismu implementací
IPersistStorage
.Podpora základních funkcí vkládání dokumentů OLE, včetně funkce Vytvořit ze souboru. To vyžaduje rozhraní
IPersistFile
,IOleObject
aIDataObject
.Podporuje jedno nebo více zobrazení, z nichž každá je schopná místní aktivaci. To znamená, že zobrazení musí podporovat rozhraní
IOleDocumentView
i rozhraníIOleInPlaceObject
aIOleInPlaceActiveObject
(pomocí rozhraní aIOleInPlaceFrame
rozhraní kontejneruIOleInPlaceSite
).Podpora standardních rozhraní aktivních
IOleDocument
dokumentů ,IOleCommandTarget
aIPrint
.
Znalost toho, kdy a jak používat rozhraní na straně kontejneru, se v těchto požadavcích předpokládá.
Požadavky na objekty zobrazení
Aktivní dokument může vytvořit jedno nebo více zobrazení svých dat. Funkčně jsou tato zobrazení jako porty na konkrétní metodu zobrazení dat. Pokud aktivní dokument podporuje pouze jedno zobrazení, je možné aktivní dokument a toto jedno zobrazení implementovat pomocí jedné třídy. IOleDocument::CreateView
vrátí ukazatel rozhraní stejného objektu IOleDocumentView
.
Aby byla reprezentována v rámci aktivního kontejneru dokumentů, musí komponenta zobrazení podporovat IOleInPlaceObject
a IOleInPlaceActiveObject
navíc 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);
}
Každé zobrazení má přidružený web zobrazení, který zapouzdřuje rám zobrazení a port zobrazení (HWND a obdélníkovou oblast v tomto okně). Web tuto funkci zveřejňuje prostřednictvím standardního IOleInPlaceSite
rozhraní. Všimněte si, že na jednom HWND je možné mít více než jeden port zobrazení.
Každý typ zobrazení má obvykle jinou tištěnou reprezentaci. Zobrazení a odpovídající weby zobrazení by proto měly implementovat tiskové rozhraní, pokud IPrint
a IContinueCallback
, v uvedeném pořadí. Rámec zobrazení musí při zahájení tisku vyjednat se zprostředkovatelem IPrint
zobrazení, aby se správně vytiskly záhlaví, zápatí, okraje a související prvky. Poskytovatel zobrazení oznámí rámečku událostí souvisejících s tiskem prostřednictvím IContinueCallback
. Další informace o použití těchto rozhraní naleznete v tématu Programový tisk.
Všimněte si, že pokud aktivní dokument podporuje pouze jedno zobrazení, pak aktivní dokument a toto jedno zobrazení lze implementovat pomocí jedné konkrétní třídy. IOleDocument::CreateView
jednoduše vrátí ukazatel rozhraní stejného objektu IOleDocumentView
. Stručně řečeno, není nutné, aby existovaly dvě samostatné instance objektů, pokud je vyžadováno pouze jedno zobrazení.
Objekt zobrazení může být také cílem příkazu. Implementace IOleCommandTarget
zobrazení může přijímat příkazy, které pocházejí z uživatelského rozhraní kontejneru (například Nový, Otevřít, Uložit jako, Tisk v nabídce Soubor a Kopírovat, Vložit, Zpět v nabídce Upravit ). Další informace naleznete v tématu Zpracování zpráv a cíle příkazů.