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


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

Активные документы расширяют составную технологию документов OLE. Эти расширения предоставляются в виде дополнительных интерфейсов, которые управляют представлениями, чтобы объекты могли функционировать в контейнерах и сохранять контроль над их функциями отображения и печати. Этот процесс позволяет отображать документы как в внешних кадрах (например, в Microsoft Office Binder или Microsoft Internet Explorer), так и в собственных кадрах (например, в портах представления продукта).

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

См. также

Активное содержимое документа