Отрисовка задания печати
Внимание
Современная платформа печати — это предпочтительный способ взаимодействия с принтерами Windows. Рекомендуется использовать драйвер класса "Входящие" Microsoft IPP вместе с приложениями поддержки печати (PSA), чтобы настроить возможности печати в Windows 10 и 11 для разработки устройств принтера.
Дополнительные сведения см. в статье "Современная платформа печати" и руководство по проектированию приложений поддержки печати.
Задания печати отображаются как созданные или записываются в файл спуля в виде записей EMF. В случае записей EMF выполняется отрисовка, когда обработчик печати EMF (localspl.dll) воспроизводит записи. Отрисовка состоит из ряда вызовов функций рисования GDI в пользовательском режиме, начиная с CreateDC. Вызов CreateDC является первым в серии вызовов приложений, которые приводят к цепочке действий, связанных с подсистемой отрисовки графики (GRE, также известной как GDI в режиме ядра) и библиотекой DLL графики принтера.
На следующем рисунке показано взаимодействие между GDI в режиме ядра и библиотекой DLL графики принтера после вызова CreateDC .
Когда приложение вызывает функцию CreateDC для создания контекста устройства принтера, GDI проверяет, загружена ли соответствующая библиотека DLL графики принтера. Если это не так, GDI загружает библиотеку DLL и вызывает функцию DrvEnableDriver в библиотеке DLL. Функция не вызывается снова, если драйвер не перезагрузится.
Затем GDI вызывает функцию DrvEnablePDEV библиотеки DLL принтера, чтобы драйвер смог создать экземпляр физического устройства и вернуть характеристики устройства. GDI использует возвращаемые сведения для создания внутреннего описания экземпляра устройства.
Затем GDI вызывает функцию DrvCompletePDEV графической библиотеки DLL для предоставления дескриптора GDI экземпляру устройства. Библиотека DLL графики должна использовать этот дескриптор в качестве входных данных для некоторых префиксированных вызовов, предоставляемых обработчиком рисования GDI (см . службы поддержки GDI).
После того как GDI получает дескриптор экземпляра устройства, он вызывает функцию DrvEnableSurface графической библиотеки DLL, которая настраивает поверхность для рисования и связывает ее с физическим экземпляром устройства.
Драйвер может создать область рисования для экземпляра устройства, вызвав EngCreateBitmap. Кроме того, если поверхность рисования управляется устройством, драйвер может вызвать EngCreateDeviceSurface.
Если EngCreateBitmap не может предоставить растровое изображение достаточно большого размера, чтобы содержать всю физическую страницу, и если драйвер поддерживает полосу страниц, можно вызвать EngMarkBandingSurface, чтобы сообщить GDI о том, что полосирование будет использоваться.
Наконец, необходимо вызвать EngAssociateSurface, чтобы разрешить GDI связать созданную поверхность с указанным экземпляром устройства и сообщить GDI, какие функции рисования графических DDI (если таковые есть) должны вызываться при рисовании на этой конкретной поверхности.
На этом этапе была создана область рисования и может начаться отрисовка. Функции, вызываемые GDI, зависят от того, действует ли полоса.
Использование полосы
Для каждого документа, отрисовываемого при использовании полосы, GDI вызывает следующие функции в библиотеке DLL графики принтера:
Для каждой физической страницы
Для каждой передачи по полосам на физической странице
Операции отрисовки
DrvNextBand // Отправка растровых данных для этой полосы, а затем очистка поверхности для повторного использования с следующей группой
Полосирование не используется
Для каждого документа, отрисовываемого при использовании полосы, GDI вызывает следующие функции в библиотеке DLL графики принтера:
Для каждой физической страницы
Операции отрисовки
DrvSendPage // Отправка растровых данных для страницы
За исключением DrvQueryPerBandInfo, эти функции предназначены для отправки последовательностей элементов управления на оборудование принтера (путем вызова EngWritePrinter) и выполнения внутренних операций, необходимых для инициализации или полной обработки документа, страницы или полосы.
Библиотека DLL графики принтера отвечает за отправку отрисованного изображения (т. е. содержимого поверхности рисования) принтеру в соответствующее время (вызывая EngWritePrinter), как показано ниже.
Для поверхностей растровых карт, управляемых GDI или устройствами
Область рисования — это точечный рисунок, предоставленный GDI или драйвером. Библиотека DLL графики принтера может подключить некоторые функции рисования (см . согласование Surface). Если полоса страниц используется, функция DrvNextBand должна отправлять содержимое поверхности документа. Если полоса не используется, функция DrvSendPage должна отправить содержимое поверхности документа.
Для поверхностей векторов, управляемых устройством
Область рисования находится на устройстве. Библиотека DLL графики принтера перехватывает все функции рисования (см. сведения о согласовании Surface), а эти функции отправляют данные изображения на принтер во время операций отрисовки. Полоса страниц не используется.
Если предполагается, что любая функция DDI графики, предоставляемая библиотекой DLL принтера, может занять более пяти секунд, необходимо включить код, вызывающий EngCheckAbort по крайней мере каждые пять секунд, чтобы узнать, следует ли завершить задание печати.
После того как GDI вызывает DrvEndDoc, чтобы указать, что документ был полностью отрисован, он вызывает DrvDisableSurface. Если DrvEnableSurface называется EngCreateBitmap, drvDisableSurface должен вызвать EngDeleteSurface.
GDI вызывает функцию DrvDisablePDEV библиотеки dll принтера, когда приложение вызывает DeleteDC.
Если приложение вызывает функцию ResetDC во время печати документа, GDI создает новый контекст устройства и вызывает функцию DrvEnablePDEV библиотеки DLL принтера для нового контекста. Затем GDI вызывает функцию DrvResetPDEV , чтобы библиотека DLL графики может обновить новый контекст с информацией из старой. Затем drvDisableSurface и DrvDisablePDEV вызываются для старого контекста, а затем drvEnableSurface для нового контекста. Наконец, GDI вызывает DrvStartDoc и возобновление отрисовки на новой странице.
GDI вызывает DrvDisableDriver перед выгрузкой библиотеки DLL графики принтера.
Если оборудование принтера поддерживает операции рисования, которые не поддерживаются функциями рисования GDI, библиотека DLL графики принтера может предоставить функцию DrvDrawEscape.
Библиотека DLL графики принтера может предоставить функцию DrvEscape , если необходимо поддерживать операции рисования или недравирования, недоступные через функции GDI. Например, драйвер принтера Microsoft PostScript использует экраны для поддержки точек внедрения PostScript. Кроме того, приложению может потребоваться получить номер телефона факсимильной машины. Функция DrvEscape также используется для указания операций, поддерживаемых функцией DrvDrawEscape.