Kontenery dokumentów aktywnych
Aktywny kontener dokumentów, taki jak Microsoft Office Binder lub Internet Explorer, umożliwia pracę z kilkoma dokumentami różnych typów aplikacji w ramach jednej ramki (zamiast wymuszać tworzenie i używanie wielu ramek aplikacji dla każdego typu dokumentu).
Usługa MFC zapewnia pełną obsługę aktywnych kontenerów dokumentów w COleDocObjectItem
klasie . Kreatora aplikacji MFC można użyć do utworzenia aktywnego kontenera dokumentów, zaznaczając pole wyboru Aktywny kontener dokumentów na stronie Obsługa dokumentów złożonych Kreatora aplikacji MFC. Aby uzyskać więcej informacji, zobacz Tworzenie aktywnej aplikacji kontenera dokumentów.
Aby uzyskać więcej informacji na temat aktywnych kontenerów dokumentów, zobacz:
Wymagania dotyczące kontenera
Obsługa aktywnego dokumentu w aktywnym kontenerze dokumentów oznacza więcej niż tylko implementacje interfejsu: wymaga również znajomości interfejsów zawartego obiektu. Dotyczy to również aktywnych rozszerzeń dokumentów, w których kontener musi również wiedzieć, jak używać tych interfejsów rozszerzeń w samych aktywnych dokumentach.
Aktywny kontener dokumentów, który integruje aktywne dokumenty, musi:
Być w stanie obsługiwać magazyn obiektów za pośrednictwem interfejsu
IPersistStorage
, czyli musi dostarczyćIStorage
wystąpienie do każdego aktywnego dokumentu.Obsługa podstawowych funkcji osadzania dokumentów OLE, co wymaga "lokacji" obiektów (jeden na dokument lub osadzanie), które implementują
IOleClientSite
iIAdviseSink
.Obsługa aktywacji w miejscu obiektów osadzonych lub aktywnych dokumentów. Obiekty lokacji kontenera muszą zostać zaimplementowane
IOleInPlaceSite
, a obiekt ramki kontenera musi podać elementIOleInPlaceFrame
.Obsługa rozszerzeń aktywnych dokumentów przez zaimplementowanie
IOleDocumentSite
w celu zapewnienia mechanizmu komunikacji z dokumentem dla kontenera. Opcjonalnie kontener może implementować aktywne interfejsyIOleCommandTarget
dokumentów iIContinueCallback
pobierać proste polecenia, takie jak drukowanie lub zapisywanie.
Obiekt ramki, obiekty widoku i obiekt kontenera można opcjonalnie zaimplementować IOleCommandTarget
w celu obsługi wysyłania określonych poleceń, zgodnie z opisem w temacie Command Targets (Obiekty docelowe poleceń). Obiekty widoku i kontenera mogą również opcjonalnie implementować IPrint
i IContinueCallback
, aby obsługiwać drukowanie programowe, zgodnie z opisem w temacie Drukowanie programowe.
Na poniższej ilustracji przedstawiono relacje koncepcyjne między kontenerem a jego składnikami (po lewej) oraz aktywnym dokumentem i jego widokami (po prawej stronie). Aktywny dokument zarządza magazynem i danymi, a widok wyświetla lub opcjonalnie wyświetla te dane. Interfejsy pogrubione są wymagane do aktywnego uczestnictwa w dokumencie; te pogrubienie i kursywa są opcjonalne. Wszystkie inne interfejsy są wymagane.
Dokument obsługujący tylko jeden widok może implementować zarówno składniki widoku, jak i dokumentu (czyli odpowiadające im interfejsy) w pojedynczej klasie betonowej. Ponadto lokacja kontenera, która obsługuje tylko jeden widok jednocześnie, może połączyć witrynę dokumentu i lokację widoku w jedną konkretną klasę lokacji. Obiekt ramki kontenera musi jednak pozostać odrębny, a składnik dokumentu kontenera jest jedynie uwzględniony w tym miejscu, aby przedstawić pełny obraz architektury; nie ma to wpływu na architekturę zawierania dokumentów aktywnych.
Obiekty witryny dokumentu
W architekturze zawierającej aktywny dokument lokacja dokumentu jest taka sama jak obiekt lokacji klienta w dokumentach OLE z dodatkiem interfejsu IOleDocument
:
interface IOleDocumentSite : IUnknown
{
HRESULT ActivateMe(IOleDocumentView *pViewToActivate);
}
Witryna dokumentu jest koncepcyjnie kontenerem dla co najmniej jednego obiektu "wyświetl witrynę". Każdy obiekt witryny widoku jest skojarzony z poszczególnymi obiektami widoku dokumentu zarządzanymi przez witrynę dokumentu. Jeśli kontener obsługuje tylko jeden widok dla witryny dokumentu, może zaimplementować witrynę dokumentu i witrynę widoku z pojedynczą klasą betonową.
Wyświetlanie obiektów witryny
Obiekt witryny widoku kontenera zarządza miejscem wyświetlania dla określonego widoku dokumentu. Oprócz obsługi standardowego IOleInPlaceSite
interfejsu lokacja widoku zwykle implementuje IContinueCallback
również kontrolkę drukowania programowego. (Należy pamiętać, że obiekt widoku nigdy nie wykonuje zapytań, IContinueCallback
aby można go było zaimplementować w dowolnym obiekcie, którego kontener pragnie).
Kontener obsługujący wiele widoków musi być w stanie utworzyć wiele obiektów lokacji widoku w witrynie dokumentu. Zapewnia to każdy widok z oddzielnymi usługami aktywacji i dezaktywacji udostępnianymi za pośrednictwem programu IOleInPlaceSite
.
Obiekt ramki
Obiekt ramki kontenera jest w większości tą samą ramką, która jest używana do aktywacji w miejscu w dokumentach OLE, czyli tej, która obsługuje negocjacje menu i paska narzędzi. Obiekt widoku ma dostęp do tego obiektu ramki za pośrednictwem IOleInPlaceSite::GetWindowContext
programu , który zapewnia również dostęp do obiektu kontenera reprezentującego dokument kontenera (który może obsługiwać negocjacje paska narzędzi na poziomie okienka i zawarte wyliczenie obiektu).
Aktywny kontener dokumentów może rozszerzyć ramkę, dodając IOleCommandTarget
element . Dzięki temu może odbierać polecenia pochodzące z interfejsu użytkownika aktywnego dokumentu w taki sam sposób, jak ten interfejs może umożliwić kontenerowi wysyłanie tych samych poleceń (takich jak Plik nowy, Otwórz, Zapisz jako, Drukuj; Edytuj aktywną dokumentację: Kopiuj, Wklej, Cofnij i inne. Aby uzyskać więcej informacji, zobacz Obiekty docelowe poleceń.