Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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 swoją zdolność do tworzenia widoków poprzez 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 aplikacjach pakietu Office).
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żdy może być aktywowany na miejscu. Oznacza to, że widoki muszą obsługiwać interfejs
IOleDocumentView
, a także interfejsyIOleInPlaceObject
iIOleInPlaceActiveObject
(przy użyciu interfejsówIOleInPlaceSite
iIOleInPlaceFrame
kontenera).Obsługa standardowych aktywnych interfejsów dokumentów
IOleDocument
,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. Funkcjonalnie, te widoki są jak punkty dostępu do określonej metody 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 skojarzoną stronę widoku, która zawiera ramkę widoku i port widoku (HWND i prostokątny obszar w tym oknie). Witryna uwidacznia tę funkcję przez standardowy interfejs 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ą. Zatem widoki i odpowiednie lokalizacje widoku powinny wdrażać interfejsy drukowania, jeśli IPrint
i IContinueCallback
, odpowiednio. Ramka widoku musi negocjować z dostawcą widoku poprzez IPrint
, kiedy rozpocznie się drukowanie, 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.
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ń.