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


Использование функций GDI в обработчиках печати

Набор функций GDI пользовательского режима экспортируется Gdi32.dll для использования в печатных процессорах, обрабатывающих EMF на основе NT в качестве формата входных данных. В следующей таблице перечислены предоставляемые функции.

Имя функции Описание
GdiDeleteSpoolFileHandle Освобождает дескриптор файла очереди.
GdiEndDocEMF Завершает операции воспроизведения EMF для документа задания печати.
GdiEndPageEMF Завершает операции воспроизведения EMF для физической страницы и извлекает страницу из принтера.
GdiGetDC Возвращает дескриптор для контекста устройства принтера.
GdiGetDevmodeForPage Возвращает структуру DEVMODEW страницы документа.
GdiGetPageCount Возвращает количество страниц документа.
GdiGetPageHandle Возвращает дескриптор страницы документа.
GdiGetSpoolFileHandle Возвращает дескриптор файла очереди, необходимый в качестве входных данных для других функций GDI.
GdiPlayPageEMF Воспроизводит записи EMF, связанные со страницей документа.
GdiResetDCEMF Сбрасывает контекст устройства принтера.
GdiStartDocEMF Выполняет операции инициализации для документа задания печати.
GdiStartPageEMF Выполняет операции инициализации для физической страницы.

PrintDocumentOnPrintProcessor обработчика печати EMF должен вызывать GdiGetSpoolFileHandle, чтобы получить дескриптор файла очереди, и GdiGetDC для получения дескриптора контекста устройства принтера. Затем он может выполнить следующие действия:

  • Для каждого документа задания печати необходимо вызывать GdiStartDocEMF до воспроизведения записей EMF, а GdiEndDocEMF — после воспроизведения последней записи EMF.

  • Для печати каждой физической страницы необходимо вызвать GdiStartPageEMF перед рисованием всех страниц документа, а GdiEndPageEMF — после того, как последняя страница документа была отрисована на физической странице.

  • Чтобы нарисовать каждую страницу документа на физической странице, необходимо вызвать GdiGetDevmodeForPage , чтобы определить, изменилось ли содержимое структуры DEVMODE с момента создания последней страницы документа. Если DEVMODE изменилась, необходимо запустить новую физическую страницу (путем вызова GdiEndPageEMF и GdiStartPageEMF), а контекст устройства принтера необходимо обновить, вызвав GdiResetDCEMF. Страница документа рисуется на физической странице путем вызова GdiGetPageHandle для получения дескриптора страницы документа, а затем вызова GdiPlayPageEMF для рисования страницы.

После полной отрисовки задания обработчик печати должен вызвать GdiDeleteSpoolFileHandle.

Если обработчику печати требуется общее количество страниц, прежде чем он сможет начать печать страниц (например, для печати страниц в обратном порядке), он может вызвать GdiGetPageCount, но эта функция не возвращается, пока не завершится повторение и, таким образом, отключает возможность печати во время печати.

Если обработчик печати использует эти функции GDI, его функция EnumPrintProcessorDatatypes должна возвращать "NT EMF" в качестве поддерживаемого типа данных, который представляет универсальный формат EMF Windows 2000 и более поздних версий. Обработчик печати не должен изменять записи EMF.