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


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

OLE предоставил средства для уникальной идентификации постоянных документов (GetClassFile) и загрузки их в связанный код (CoCreateInstance, QueryInterface(IID_IPersistFile), QueryInterface(IID_IPersistStorage), IPersistFile::Load и 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\{...}\Printable

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

Во время процедуры печати может потребоваться, чтобы клиент или контейнер, инициирующий печать, контролировать, следует ли продолжать печать. Например, контейнер может поддерживать команду 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").

См. также

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