DEVMODEW 结构

DEVMODEW 结构是 DEVMODE 结构的 Unicode 版本,Microsoft Windows SDK文档中对此进行介绍。 (DEVMODEW 上的“W”后缀代表“wide”或 Unicode 字符。) 虽然应用程序可以使用任一结构,但驱动程序需要使用 DEVMODEW 结构,而不是 DEVMODE 结构。

公共和专用成员

紧跟在 DEVMODEW 结构的已定义成员 (通常称为其公共 DEVMODEW 成员) 之后,可以有一组驱动程序定义成员 (其专用 DEVMODEW 成员) 。 下图显示了公共部分 (实际 DEVMODEW 结构本身) 和专用部分。

说明 DEVMODEW 结构的公共和专用部分的示意图。

通常,专用成员仅由打印机驱动程序使用。 驱动程序在 dmDriverExtra 成员中提供此专用区域的大小(以字节为单位)。 驱动程序定义的专用成员供驱动程序独占使用。

对于打印机驱动程序,DEVMODEW 结构用于指定打印文档的用户选项。 它还用于指定打印机的这些选项的默认值,例如要打印的份数、纸张大小和其他属性。 对于显示设备,DEVMODEW 结构指定显示属性,例如每像素的位数、像素尺寸和显示频率。

初始化 DEVMODEW 结构

根据显示驱动程序还是打印机驱动程序使用它,DEVMODEW 结构会以两种不同的方式初始化。

  • 显示驱动程序 DEVMODEW 初始化

    显示驱动程序的 DrvGetModes 入口点将 DEVMODEW 结构的所有成员初始化为零。 然后,DrvGetModes 将显示驱动程序 DLL 的名称复制到 dmDeviceName 成员,使用 DEVMODEW 结构的版本填充 dmSpecVersiondmDriverVersion 成员,并将显示属性信息复制到相应的成员。

  • 打印机驱动程序 DEVMODEW 初始化

    当应用程序调用 DocumentProperties (打印机接口 DLL 函数(如 Microsoft Windows SDK 文档) 或 DrvDocumentPropertySheets (基于 NT 的操作系统图形 DDI) )中所述,将使用默认值创建 DEVMODEW 结构。 然后,应用程序可以自由修改任何公共 DEVMODEW 成员。 进行任何更改后,应用程序应对之前调用的同一函数进行第二次调用,以便将更改的成员与驱动程序内部 DEVMODEW 结构的成员合并。 第二次调用是必需的,因为某些更改可能无法正常工作;必须调用打印机驱动程序来更正 DEVMODEW 结构。 当文档即将打印时,应用程序会将合并的 DEVMODEW 结构传递给 Microsoft Windows SDK 文档) 中所述的 CreateDC (,后者将其传递给 DrvEnablePDEV DDI。 此时,驱动程序的呈现 DLL 会验证 DEVMODEW 结构,并在必要时在执行打印作业之前进行修复。

使用 DEVMODEW 结构

多个 API 和图形 DDI 将 DEVMODEW 结构中的信息用于打印、查询设备功能、显示用户界面等目的。 例如, DrvConvertDevMode 是打印后台处理程序图形 DDI,它将 DEVMODEW 结构从一个操作系统版本转换为另一个操作系统版本。 如果打印机驱动程序从其他操作系统版本上运行的另一台计算机获取 DEVMODEW 结构,则可能需要这样做。

修改 DEVMODEW 结构

应用程序和驱动程序可以免费请求 DEVMODEW 结构并直接修改其公共部分。 但是,仅允许驱动程序修改专用 DEVMODEW 结构成员。

若要修改专用 DEVMODEW 结构成员,驱动程序必须先确定私有数据开头的偏移量。 给定指向此结构的开头的指针,以及 dmSize 成员(该成员包含结构的公共部分的大小),可以找到专用部分的开头。 以下示例演示如何初始化指向专用节开头的指针。 在此示例中, pdm 指向 DEVMODEW 结构的开头。

PVOID pvDriverData = (PVOID)  (((BYTE *) pdm) + (pdm -> dmSize));

打印机驱动程序/显示驱动程序 DEVMODEW 差异

DEVMODEW 结构成员分为三类:

  • 仅打印机驱动程序使用的成员

  • 仅显示驱动程序使用的成员

  • 打印机和显示驱动程序使用的成员

下表列出了 几个仅由 打印机驱动程序使用的公共 DEVMODEW 成员:

仅由打印机驱动程序使用 目的
dmScale 指定缩放图像以用于打印的百分比。
dmCopies 指定要打印的份数。
dmColor 指定彩色打印机应打印颜色还是单色。
dmOrientation 指定纸张的方向,纵向或横向。

下表列出了 几个仅供 显示驱动程序使用的公共 DEVMODEW 成员:

仅由显示驱动程序使用 目的
dmBitsPerPel 指定显示设备的颜色分辨率(以每像素位数为单位)。
dmPelsWidth 指定可见设备图面的宽度(以像素为单位)。
dmPelsHeight 指定可见设备表面的高度(以像素为单位)。
dmDisplayFlags 指定显示模式 - 颜色与单色、交错与非交错。
dmDisplayFrequency 指定显示器的刷新率(以赫氏)。

第三个表列出了打印机和显示驱动程序使用的几个公共 DEVMODEW 成员:

打印机和显示驱动程序使用 目的
dmDeviceName 对于 display,指定显示驱动程序的 DLL。 对于打印机,指定打印机的“友好名称”。
dmFields 指定位标志,标识其后面的哪些 DEVMODEW 成员正在使用。 例如,当 dmBitsPerPel 成员包含有效数据时,将设置DM_BITSPERPEL标志。
dmSize 指定 DEVMODEW 结构的公共部分的大小(以字节为单位)。
dmDriverExtra 指定公共结构成员后面的专用驱动程序数据的字节数。 对于显示驱动程序,这通常为零。