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