Структура DEVMODEW

Структура DEVMODEW — это версия структуры DEVMODE в Юникоде, описанная в документации по Microsoft Windows SDK. (Суффикс "W" в DEVMODEW означает "широкие" или символы Юникода.) Хотя приложения могут использовать обе структуры, драйверы должны использовать структуру DEVMODEW, а не структуру DEVMODE.

Открытые и закрытые члены

Сразу после определенных элементов структуры DEVMODEW (часто называемых ее общедоступными элементами DEVMODEW) может быть набор элементов, определенных драйвером (его частные члены DEVMODEW). На следующем рисунке показан открытый раздел (сама структура DEVMODEW) и закрытый раздел.

Схема, иллюстрирующая открытый и закрытый разделы структуры DEVMODEW.

Как правило, частные члены используются только драйверами принтера. Драйвер предоставляет размер этой частной области в байтах в члене dmDriverExtra . Определенные драйвером частные члены предназначены для исключительного использования драйвером.

Для драйверов принтеров структура DEVMODEW используется для указания пользовательских вариантов для печатного документа. Он также используется для указания значений по умолчанию для принтеров, таких как количество копий для печати, размер бумаги и другие атрибуты. Для устройств отображения структура DEVMODEW определяет такие атрибуты отображения, как количество битов на пиксель, размеры пикселей и частота отображения.

Инициализация структуры DEVMODEW

В зависимости от того, будет ли она использоваться драйвером дисплея или драйвером принтера, структура DEVMODEW инициализируется двумя разными способами.

  • Инициализация DEVMODEW драйвера отображения

    Точка входа DrvGetModes драйвера дисплея инициализирует все элементы структуры DEVMODEW до нуля. Затем DrvGetModes копирует имя библиотеки DLL драйвера отображения в член dmDeviceName, заполняет члены dmSpecVersion и dmDriverVersion версией структуры DEVMODEW и копирует отображаемые сведения об атрибутах в соответствующие члены.

  • Инициализация драйвера принтера DEVMODEW

    Когда приложение вызывает DocumentProperties (функция DLL интерфейса принтера, описанная в документации по Microsoft Windows SDK) или DrvDocumentPropertySheets (графический DDI на основе NT), создается структура DEVMODEW со значениями по умолчанию. После этого приложение может свободно изменять любые общедоступные члены DEVMODEW. После внесения изменений приложение должно выполнить второй вызов той же функции, которую оно вызывало ранее, чтобы объединить измененные элементы с элементами внутренней структуры DEVMODEW драйвера. Второй вызов необходим, так как некоторые изменения могут работать неправильно; Чтобы исправить структуру DEVMODEW, необходимо вызвать драйвер принтера. Когда документ должен быть напечатан, приложение передает объединенную структуру DEVMODEW в CreateDC (описано в документации по Microsoft Windows SDK), которая передает ее в DDI DrvEnablePDEV. В это время библиотека DLL отрисовки драйвера проверяет структуру DEVMODEW и при необходимости выполняет ремонт перед выполнением задания печати.

Использование структуры DEVMODEW

Некоторые API и графические DDIs используют сведения в структуре 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 Указывает в hertz частоту обновления дисплея.

В третьей таблице перечислены несколько общедоступных элементов DEVMODEW, которые используются драйверами принтера и дисплея:

Используется драйверами принтера и дисплея Назначение
dmDeviceName Для дисплеев указывает библиотеку DLL драйвера дисплея. Для принтеров указывает "понятное имя" принтера.
dmFields Указывает битовые флаги, определяющие, какие из следующих за ним членов DEVMODEW используются. Например, флаг DM_BITSPERPEL устанавливается, если член dmBitsPerPel содержит допустимые данные.
dmSize Указывает размер (в байтах) общедоступной части структуры DEVMODEW.
dmDriverExtra Указывает количество байтов данных частного драйвера после членов общедоступной структуры. Для драйверов отображения обычно это ноль.