Использование функций 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.