使用打印处理器中的 GDI 函数

Gdi32.dll 导出一组用户模式 GDI 函数,供处理基于 NT 的操作系统 EMF 作为输入格式的打印处理器使用。 下表列出了提供的函数。

函数名称 说明
GdiDeleteSpoolFileHandle 释放假脱机文件句柄。
GdiEndDocEMF 完成打印作业文档的 EMF 播放操作。
GdiEndPageEMF 完成物理页面的 EMF 播放操作,并从打印机中弹出页面。
GdiGetDC 返回打印机设备上下文的句柄。
GdiGetDevmodeForPage 返回文档页的 DEVMODEW 结构。
GdiGetPageCount 返回文档页数。
GdiGetPageHandle 返回文档页的句柄。
GdiGetSpoolFileHandle 返回一个后台处理文件句柄,该句柄需要作为其他 GDI 函数的输入。
GdiPlayPageEMF 播放与文档页关联的 EMF 记录。
GdiResetDCEMF 重置打印机的设备上下文。
GdiStartDocEMF 对打印作业文档执行初始化操作。
GdiStartPageEMF 对物理页执行初始化操作。

EMF 打印处理器的 PrintDocumentOnPrintProcessor 应调用 GdiGetSpoolFileHandle 以获取后台打印文件句柄,并 调用 GdiGetDC 以获取打印机的设备上下文句柄。 然后,它可以执行以下步骤:

  • 对于每个打印作业文档,必须在播放任何 EMF 记录之前调用 GdiStartDocEMF ,并且必须在播放最后一条 EMF 记录后调用 GdiEndDocEMF

  • 对于要打印的每个物理页,必须在页面上绘制任何文档页之前调用 GdiStartPageEMF ,并且必须在物理页上绘制最后一个文档页之后调用 GdiEndPageEMF

  • 对于要在物理页上绘制的每个文档页,必须调用 GdiGetDevmodeForPage 来确定自绘制最后一个文档页以来 DEVMODE 结构内容是否已更改。 如果 DEVMODE 已更改,则必须通过调用 GdiEndPageEMFGdiStartPageEMF) (启动新的物理页面,并且必须通过调用 GdiResetDCEMF 来更新打印机的设备上下文。 通过首先调用 GdiGetPageHandle 获取文档页句柄,然后调用 GdiPlayPageEMF 绘制页面,在物理页上绘制文档页。

完全绘制作业后,打印处理器必须调用 GdiDeleteSpoolFileHandle

如果打印处理器需要总页计数,然后才能开始打印页面 (例如,以相反顺序打印页面) 它可以调用 GdiGetPageCount,但此函数在后台打印结束之前不会返回,因此会禁用在后台打印时打印的功能。

如果打印处理器使用这些 GDI 函数,则其 EnumPrintProcessorDatatypes 函数必须返回“NT EMF”作为支持的数据类型,该数据类型表示通用 Windows 2000 及更高版本的 EMF 格式。 打印处理器不得修改 EMF 记录。