处理设备管理的图面
重要
新式打印平台是 Windows 与打印机通信的首选方式。 建议使用 Microsoft 的 IPP 收件箱类驱动程序以及打印支持应用 (PSA) 来自定义 Windows 10 和 11 中的打印体验,以便进行打印机设备开发。
有关详细信息,请参阅新式打印平台和打印支持应用设计指南。
当 Unidrv 呈现打印页面图像时,它会使用 GDI 管理的绘图图面。 所有图像均以位图呈现。 对于具有无法通过这种方案利用的功能(如绘制矢量的功能)的设备,可以为设备管理的绘图图面提供自定义的驱动程序支持。 要支持设备管理的图面,必须提供能实现以下功能的呈现插件:
所有 Unidrv 支持的图形 DDI 绘图函数的一组挂接函数。 必须挂接以下函数:
DrvAlphaBlendDrvBitBltDrvCopyBitsDrvDitherColorDrvFillPathDrvGradientFillDrvLineToDrvPlgBltDrvRealizeBrushDrvStretchBltDrvStretchBltROPDrvStrokeAndFillPathDrvStrokePathDrvTextOutDrvTransparentBlt
IPrintOemUni::EnableDriver 方法,用于向 Unidrv 提供指向图形 DDI 挂接函数的指针。
IPrintOemUni::DriverDMS 方法,它会通知 Unidrv 将使用设备管理的图面,并指定图面将使用哪个已定义的挂接函数。
在设备管理的图面上绘图时,挂接函数不能回调 GDI 的 Eng 前缀支持服务。 但是,它们可以创建一个临时位图图面,然后将该图面的句柄传递给 Eng 前缀的绘图函数(请参阅呈现打印作业)。
IPrintOemUni::DriverDMS 方法会在每次即将呈现打印作业时被调用,因此呈现插件可以为每个作业指定呈现图面类型(由 GDI 管理或设备管理)。 要根据用户界面中的可选项来选择图面,则还需要提供用户界面插件。
在设备管理的图面上绘制文本
呈现插件必须挂接 Unidrv 的 DrvTextOut 函数(以及所有其他图形 DDI 绘图函数)。 为设备管理的图面创建文本涉及以下四个函数之间的交互:
Unidrv 的 DrvTextOut 函数
呈现插件的 DrvTextOut 挂接函数
Unidrv 的 IPrintOemDriverUni::DrvUniTextOut 方法
呈现插件的 IPrintOemUni::TextOutAsBitmap 方法
在设备管理的图面上显示文本的步骤如下:
GDI 调用 Unidrv 的 DrvTextOut 函数。
Unidrv 调用呈现插件的 DrvTextOut 挂接函数。
挂接函数向设备发送指令,以便指定文字的画笔、旋转和剪辑区域。
挂接函数调用 Unidrv 的 IPrintOemDriverUni::DrvUniTextOut 方法,该方法会使用下载的字体输出文本。 这种方法还能处理基于字形的剪辑。
如果 IPrintOemDriverUni::DrvUniTextOut 无法使用可下载字体(因为字体不可用或已旋转),则会调用呈现插件的 IPrintOemUni::TextOutAsBitmap 方法,将文本绘制为位图。
在 IPrintOemDriverUni::DrvUniTextOut 返回后,DrvTextOut 挂接函数必须根据 DrvTextOut 函数的 prclExtra 参数指定的矩形,使用矢量命令(如果支持)绘制下划线和删除线。