Активные документы
Активные документы расширяют составную технологию документов OLE. Эти расширения предоставляются в виде дополнительных интерфейсов, которые управляют представлениями, чтобы объекты могли функционировать в контейнерах и сохранять контроль над их функциями отображения и печати. Этот процесс позволяет отображать документы как в внешних кадрах (например, в Microsoft Office Binder или Microsoft Internet Обозреватель), так и в собственных кадрах (например, в портах представления продукта).
В этом разделе описываются функциональные требования для активных документов. Активный документ владеет набором данных и имеет доступ к хранилищу, где данные можно сохранить и извлечь. Он может создавать и управлять одним или несколькими представлениями данных. Помимо поддержки обычных интерфейсов внедрения и на месте интерфейсов активации документов OLE, активный документ сообщает о своей способности создавать представления с помощью IOleDocument
. В этом интерфейсе контейнер может попросить создать (и, возможно, перечислить) представления, которые может отображать активный документ. В этом интерфейсе активный документ также может предоставлять другие сведения о себе, например, поддерживает ли он несколько представлений или сложные прямоугольники.
Ниже приведен IOleDocument
интерфейс. Обратите внимание, что IEnumOleDocumentViews
интерфейс является стандартным перечислителем OLE для IOleDocumentView*
типов.
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);
}
Каждый активный документ должен иметь поставщик кадров представления с этим интерфейсом. Если документ не внедрен в контейнер, активный сервер документов должен предоставить кадр представления. Однако при внедрении активного документа в активный контейнер документов контейнер предоставляет кадр представления.
Активный документ может создать один или несколько типов представлений данных (например, обычный, контур, макет страницы и т. д.). Представления действуют как фильтры, с помощью которых можно просмотреть данные. Даже если документ имеет только один тип представления, может потребоваться поддерживать несколько представлений в качестве средства поддержки новых функциональных возможностей окна (например, элемент "Новое окно" в меню "Окно" в Приложение Office ликации).
Требования к активным документам
Активный документ, который можно отобразить в активном контейнере документов, должен:
Использование составных файлов OLE в качестве механизма хранения путем реализации
IPersistStorage
.Поддержка основных функций внедрения документов OLE, включая создание из файла. Это требует интерфейсов
IPersistFile
иIOleObject
IDataObject
.Поддержка одного или нескольких представлений, каждая из которых может активироваться на месте. То есть представления должны поддерживать интерфейс
IOleDocumentView
, а также интерфейсыIOleInPlaceObject
иIOleInPlaceActiveObject
(с помощью контейнеровIOleInPlaceSite
иIOleInPlaceFrame
интерфейсов).Поддержка стандартных активных интерфейсов
IOleDocument
документов иIOleCommandTarget
IPrint
.
Знание того, когда и как использовать интерфейсы на стороне контейнера, подразумевается в этих требованиях.
Требования к объектам представления
Активный документ может создавать одно или несколько представлений данных. Функционально эти представления похожи на порты для отображения данных в определенном методе. Если активный документ поддерживает только одно представление, активный документ и одно представление можно реализовать с помощью одного класса. IOleDocument::CreateView
возвращает указатель интерфейса того же объекта IOleDocumentView
.
Для представления в активном контейнере документов компонент представления должен поддерживаться IOleInPlaceObject
и IOleInPlaceActiveObject
в дополнение к 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);
}
Каждое представление имеет связанный сайт представления, который инкапсулирует кадр представления и порт представления (HWND и прямоугольную область в этом окне). Сайт предоставляет эту функцию, хотя и стандартный IOleInPlaceSite
интерфейс. Обратите внимание, что на одном HWND можно использовать несколько портов представления.
Как правило, каждый тип представления имеет другое печатное представление. Поэтому представления и соответствующие сайты представлений должны реализовывать интерфейсы печати, если IPrint
и IContinueCallback
соответственно. Кадр представления должен согласовываться с поставщиком IPrint
представления при начале печати, чтобы заголовки, нижние колонтитулы, поля и связанные элементы печатались правильно. Поставщик представлений уведомляет кадр событий, связанных с IContinueCallback
печатью. Дополнительные сведения об использовании этих интерфейсов см. в статье "Программная печать".
Обратите внимание, что если активный документ поддерживает только одно представление, то активный документ и одно представление можно реализовать с помощью одного конкретного класса. IOleDocument::CreateView
просто возвращает указатель интерфейса того же объекта IOleDocumentView
. Короче говоря, не обязательно, что существует два отдельных экземпляра объектов, если требуется только одно представление.
Объект представления также может быть целевым объектом команды. Реализуя IOleCommandTarget
представление, можно получать команды, созданные в пользовательском интерфейсе контейнера (например, "Создать", "Открыть", "Сохранить как", "Печать" в меню "Файл"; и "Копировать", "Вставить", "Отменить" в меню "Изменить"). Дополнительные сведения см. в разделе "Обработка сообщений" и целевые объекты команд.