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


Программная печать

OLE предоставил средства для уникальной идентификации постоянных документов (GetClassFile) и загрузки их в связанный код (CoCreateInstance, , QueryInterface(IID_IPersistFile), IPersistFile::LoadQueryInterface(IID_IPersistStorage)и).IPersistStorage::Load Для дальнейшего включения печати документов активный документ содержит (используя существующую конструкцию OLE, которая изначально не поставляется с OLE 2.0) представляет базовый стандартный интерфейс печати, общедоступный через любой объект, IPrintкоторый может загружать постоянное состояние типа документа. Каждое представление активного документа может при необходимости поддерживать IPrint интерфейс для предоставления этих возможностей.

Интерфейс IPrint определяется следующим образом:

interface IPrint : IUnknown
    {
    HRESULT SetInitialPageNum([in] LONG nFirstPage);
    HRESULT GetPageInfo(
        [out] LONG *pnFirstPage,
        [out] LONG *pcPages);
    HRESULT Print(
        [in] DWORD grfFlags,
        [in,out] DVTARGETDEVICE **pptd,
        [in,out] PAGESET ** ppPageSet,
        [in,out] STGMEDIUM **ppstgmOptions,
        [in] IContinueCallback* pCallback,
        [in] LONG nFirstPage,
        [out] LONG *pcPagesPrinted,
        [out] LONG *pnPageLast);
    };

Клиенты и контейнеры просто используются IPrint::Print для указания документу печати после загрузки документа, указания флагов элементов управления печатью, целевого устройства, страниц для печати и дополнительных параметров. Клиент также может управлять продолжением печати через интерфейс IContinueCallback (см. ниже).

Кроме того, поддерживает возможность печати ряда документов в виде одного путем простого нумерирования страниц, очевидно, IPrint::SetInitialPageNum преимущество для активных контейнеров документов, таких как Office Binder. IPrint::GetPageInfo упрощает отображение сведений о разбиении на страницы, позволяя вызывающему объекту получить начальный номер страницы, переданный ранее SetInitialPageNum (или внутренний номер начальной страницы документа по умолчанию) и количество страниц в документе.

Объекты, которые поддерживаются IPrint в реестре, помечены ключом Printable, хранящимся в CLSID объекта:

HKEY_CLASSES_ROOT\CLSID\{...} \Печати

IPrint обычно реализуется в том же объекте, который поддерживает либо IPersistFile IPersistStorage. Вызывающие отмечают возможность программной печати постоянного состояния определенного класса, глядя в реестре для ключа "Печать". В настоящее время "Printable" указывает на поддержку по крайней мереIPrint; другие интерфейсы могут быть определены в будущем, которые затем будут доступны, когда IPrint QueryInterface просто представляет базовый уровень поддержки.

Во время процедуры печати может потребоваться, чтобы клиент или контейнер, инициирующий печать, контролировать, следует ли продолжать печать. Например, контейнер может поддерживать команду Stop Print, которая должна завершить задание печати как можно скорее. Для поддержки этой возможности клиент печатного объекта может реализовать небольшой объект приемника уведомлений с помощью интерфейса IContinueCallback:

interface IContinueCallback : IUnknown
    {
    HRESULT FContinue(void);
    HRESULT FContinuePrinting(
        [in] LONG cPagesPrinted,
        [in] LONG nCurrentPage,
        [in] LPOLESTR pszPrintStatus);
    };

Этот интерфейс предназначен для использования в качестве универсальной функции обратного вызова продолжения, которая занимает место различных процедур продолжения в API Win32 (например AbortProc , для печати и EnumMetafileProc перечисления метафайлов). Таким образом, этот дизайн интерфейса полезен в различных процессах, потребляющих много времени.

В большинстве универсальных случаев IContinueCallback::FContinue функция вызывается периодически любым длительным процессом. Объект приемника возвращает S_OK, чтобы продолжить операцию, и S_FALSE, чтобы остановить процедуру как можно скорее.

FContinueоднако не используется в контексте IPrint::Print; вместо печати используется IContinueCallback::FContinuePrint. Любой объект печати должен периодически вызывать FContinuePrinting количество страниц, которые печатались, число страниц и дополнительную строку, описывающую состояние печати, которое клиент может выбрать для отображения пользователю (например, страница 5 из 19).

См. также

Контейнеры активных документов