Dokumenty aktywne
Aktywne dokumenty rozszerzają technologię dokumentów złożonych OLE. Te rozszerzenia są udostępniane w postaci dodatkowych interfejsów, które zarządzają widokami, dzięki czemu obiekty mogą działać w kontenerach, a jednocześnie zachować kontrolę nad ich funkcjami wyświetlania i drukowania. Ten proces umożliwia wyświetlanie dokumentów zarówno w obcych ramkach (takich jak microsoft Office Binder lub Microsoft Internet Explorer) oraz w ramkach natywnych (takich jak własne porty widoku produktu).
W tej sekcji opisano wymagania funkcjonalne dotyczące aktywnych dokumentów. Aktywny dokument jest właścicielem zestawu danych i ma dostęp do magazynu, w którym można zapisywać i pobierać dane. Może tworzyć co najmniej jeden widok danych i zarządzać nim. Oprócz obsługi zwykłych interfejsów osadzania i aktywacji w miejscu dokumentów OLE aktywny dokument komunikuje się z możliwością tworzenia widoków za pośrednictwem programu IOleDocument
. Za pomocą tego interfejsu kontener może poprosić o utworzenie (i ewentualnie wyliczenie) widoków, które może wyświetlić aktywny dokument. Za pomocą tego interfejsu aktywny dokument może również udostępniać różne informacje o sobie, takie jak obsługa wielu widoków lub złożonych prostokątów.
Poniżej przedstawiono IOleDocument
interfejs. Należy pamiętać, że IEnumOleDocumentViews
interfejs jest standardowym modułem wyliczania OLE dla IOleDocumentView*
typów.
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żdy aktywny dokument musi mieć dostawcę ramek widoku z tym interfejsem. Jeśli dokument nie jest osadzony w kontenerze, sam aktywny serwer dokumentów musi podać ramkę widoku. Jednak gdy aktywny dokument jest osadzony w aktywnym kontenerze dokumentów, kontener udostępnia ramkę widoku.
Aktywny dokument może utworzyć co najmniej jeden typ widoków danych (na przykład normalny, konspekt , układ strony itd.). Widoki działają jak filtry, za pomocą których można zobaczyć dane. Nawet jeśli dokument ma tylko jeden typ widoku, nadal możesz chcieć obsługiwać wiele widoków jako sposób obsługi nowych funkcji okna (na przykład elementu Nowy okno w menu Okno w aplikacja pakietu Office lications).
Wymagania dotyczące aktywnych dokumentów
Aktywny dokument, który można wyświetlić w aktywnym kontenerze dokumentów, musi:
Użyj plików złożonych OLE jako mechanizmu przechowywania, implementując
IPersistStorage
.Obsługa podstawowych funkcji osadzania dokumentów OLE, w tym funkcji Create From File. Wymaga to interfejsów
IPersistFile
,IOleObject
iIDataObject
.Obsługa jednego lub większej liczby widoków, z których każda może być aktywowana w miejscu. Oznacza to, że widoki muszą obsługiwać interfejs
IOleDocumentView
, a także interfejsyIOleInPlaceObject
iIOleInPlaceActiveObject
(przy użyciu interfejsów iIOleInPlaceFrame
konteneraIOleInPlaceSite
).Obsługa standardowych aktywnych interfejsów
IOleDocument
dokumentów ,IOleCommandTarget
iIPrint
.
Znajomość tego, kiedy i jak używać interfejsów po stronie kontenera, jest implikowane w tych wymaganiach.
Wymagania dotyczące wyświetlania obiektów
Aktywny dokument może utworzyć co najmniej jeden widok danych. Widoki te są funkcjonalnie podobne do portów w określonej metodzie wyświetlania danych. Jeśli aktywny dokument obsługuje tylko jeden widok, aktywny dokument i ten pojedynczy widok można zaimplementować przy użyciu jednej klasy. IOleDocument::CreateView
Zwraca wskaźnik interfejsu IOleDocumentView
tego samego obiektu.
Aby być reprezentowane w aktywnym kontenerze dokumentów, składnik widoku musi obsługiwać IOleInPlaceObject
i IOleInPlaceActiveObject
oprócz :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żdy widok ma skojarzona lokacja widoku, która hermetyzuje ramkę widoku i port widoku (HWND i prostokątny obszar w tym oknie). Witryna uwidacznia tę funkcję, choć interfejs standardowy IOleInPlaceSite
. Należy pamiętać, że istnieje możliwość posiadania więcej niż jednego portu widoku na jednym porcie HWND.
Zazwyczaj każdy typ widoku ma inną reprezentację drukowaną. W związku z tym widoki i odpowiadające im witryny widoku powinny implementować interfejsy drukowania, jeśli IPrint
i IContinueCallback
, odpowiednio. Ramka widoku musi negocjować z dostawcą widoku po IPrint
rozpoczęciu drukowania, aby nagłówki, stopki, marginesy i powiązane elementy zostały poprawnie wydrukowane. Dostawca widoku powiadamia ramkę o zdarzeniach związanych z drukowaniem za pośrednictwem elementu IContinueCallback
. Aby uzyskać więcej informacji na temat korzystania z tych interfejsów, zobacz Drukowanie programowe.
Należy pamiętać, że jeśli aktywny dokument obsługuje tylko jeden widok, aktywny dokument i ten pojedynczy widok można zaimplementować przy użyciu pojedynczej klasy betonowej. IOleDocument::CreateView
po prostu zwraca wskaźnik interfejsu IOleDocumentView
tego samego obiektu. Krótko mówiąc, nie jest konieczne, aby istnieją dwa oddzielne wystąpienia obiektów, gdy wymagany jest tylko jeden widok.
Obiekt widoku może być również obiektem docelowym polecenia. Zaimplementowanie IOleCommandTarget
widoku umożliwia odbieranie poleceń pochodzących z interfejsu użytkownika kontenera (takich jak Nowe, Otwarte, Zapisz jako, Drukowanie w menu Plik oraz Kopiowanie, Wklej, Cofnij w menu Edycja ). Aby uzyskać więcej informacji, zobacz Obsługa komunikatów i Cele poleceń.