Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
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").