Поделиться через


Активные документы

Активные документы расширяют составную технологию документов 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и IOleObjectIDataObject.

  • Поддержка одного или нескольких представлений, каждая из которых может активироваться на месте. То есть представления должны поддерживать интерфейс IOleDocumentView , а также интерфейсы IOleInPlaceObject и IOleInPlaceActiveObject (с помощью контейнеров IOleInPlaceSite и IOleInPlaceFrame интерфейсов).

  • Поддержка стандартных активных интерфейсов IOleDocumentдокументов и IOleCommandTargetIPrint.

Знание того, когда и как использовать интерфейсы на стороне контейнера, подразумевается в этих требованиях.

Требования к объектам представления

Активный документ может создавать одно или несколько представлений данных. Функционально эти представления похожи на порты для отображения данных в определенном методе. Если активный документ поддерживает только одно представление, активный документ и одно представление можно реализовать с помощью одного класса. 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 представление, можно получать команды, созданные в пользовательском интерфейсе контейнера (например, "Создать", "Открыть", "Сохранить как", "Печать" в меню "Файл"; и "Копировать", "Вставить", "Отменить" в меню "Изменить"). Дополнительные сведения см. в разделе "Обработка сообщений" и целевые объекты команд.

См. также

Вложение активного документа