Estructura DEVMODEW

La estructura DEVMODEW es la versión Unicode de la estructura DEVMODE, que se describe en la documentación de Microsoft Windows SDK. (El sufijo "W" en DEVMODEW significa "ancho" o caracteres Unicode). Aunque las aplicaciones pueden usar cualquiera de las estructuras, se requieren controladores para usar la estructura DEVMODEW en lugar de la estructura DEVMODE.

Miembros públicos y privados

Inmediatamente después de los miembros definidos de una estructura DEVMODEW (a menudo denominados miembros PÚBLICOS DEVMODEW), puede haber un conjunto de miembros definidos por el controlador (sus miembros DEVMODEW privados). En la ilustración siguiente se muestra la sección pública (la propia estructura DEVMODEW) y la sección privada.

Diagrama que ilustra las secciones públicas y privadas de la estructura DEVMODEW.

Normalmente, los miembros privados solo los usan los controladores de impresora. El controlador proporciona el tamaño, en bytes, de este área privada en el miembro dmDriverExtra . Los miembros privados definidos por el controlador son para uso exclusivo del controlador.

En el caso de los controladores de impresora, la estructura DEVMODEW se usa para especificar opciones de usuario para un documento de impresión. También se usa para especificar valores predeterminados de estas opciones para impresoras, como el número de copias que se van a imprimir, el tamaño del papel y otros atributos. En el caso de los dispositivos de visualización, la estructura DEVMODEW especifica atributos de visualización, como el número de bits por píxel, dimensiones de píxeles y frecuencia de visualización.

Inicialización de una estructura DEVMODEW

Dependiendo de si es utilizado por un controlador de pantalla o por un controlador de impresora, una estructura DEVMODEW se inicializa de dos maneras diferentes.

  • Inicialización del controlador de visualización DEVMODEW

    El punto de entrada DrvGetModes de un controlador de pantalla inicializa todos los miembros de la estructura DEVMODEW en cero. Después, DrvGetModes copia el nombre del archivo DLL del controlador para mostrar en el miembro dmDeviceName , rellena los miembros dmSpecVersion y dmDriverVersion con la versión de la estructura DEVMODEW y copia la información de atributo para mostrar en los miembros adecuados.

  • Inicialización del controlador de impresora DEVMODEW

    Cuando una aplicación realiza una llamada a DocumentProperties (una función DLL de interfaz de impresora que se describe en la documentación de Microsoft Windows SDK) o DrvDocumentPropertySheets (un DDI de gráficos de sistema operativo basado en NT), se crea una estructura DEVMODEW con valores predeterminados. Después, una aplicación puede modificar cualquiera de los miembros públicos de DEVMODEW. Después de cualquier cambio, la aplicación debe realizar una segunda llamada a la misma función a la que llamó antes, con el fin de combinar los miembros modificados con los de la estructura DEVMODEW interna del controlador. La segunda llamada es necesaria, ya que es posible que algunos cambios no funcionen correctamente; se debe llamar al controlador de impresora para corregir la estructura DEVMODEW. Cuando el documento está a punto de imprimirse, la aplicación pasa la estructura DEVMODEW combinada a CreateDC (descrita en la documentación de Microsoft Windows SDK), que la pasa a drvEnablePDEV DDI. En ese momento, el archivo DLL de representación del controlador valida la estructura DEVMODEW y realiza reparaciones, si es necesario, antes de llevar a cabo el trabajo de impresión.

Uso de una estructura DEVMODEW

Varias API y DDIs de gráficos usan la información de la estructura DEVMODEW con fines como la impresión, la consulta de funcionalidades del dispositivo, la visualización de la interfaz de usuario y otras. Por ejemplo, DrvConvertDevMode es un DDI de gráficos de cola de impresión que traduce la estructura DEVMODEW de una versión del sistema operativo a otra. Esto puede ser necesario si un controlador de impresora obtiene una estructura DEVMODEW de otra máquina que se ejecuta en otra versión del sistema operativo.

Modificar una estructura DEVMODEW

Las aplicaciones y los controladores son gratuitos para solicitar una estructura DEVMODEW y modificar su parte pública directamente. Sin embargo, solo los controladores pueden modificar los miembros privados de la estructura DEVMODEW.

Para modificar los miembros privados de la estructura DEVMODEW, un controlador debe determinar primero el desplazamiento del principio de los datos privados. Dado un puntero al principio de esta estructura y el miembro dmSize , que contiene el tamaño de la parte pública de la estructura, se puede encontrar el principio de la parte privada. En el ejemplo siguiente se muestra cómo inicializar un puntero al principio de la sección privada. En este ejemplo, pdm apunta al principio de la estructura DEVMODEW.

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

Diferencias entre el controlador de impresora y el controlador de pantalla DEVMODEW

Los miembros de la estructura DEVMODEW se dividen en tres categorías:

  • Miembros usados solo por controladores de impresora

  • Miembros usados solo por controladores de pantalla

  • Miembros usados por los controladores de impresora y visualización

En la tabla siguiente se enumeran varios miembros públicos de DEVMODEW que solo usan los controladores de impresora:

Usado solo por controladores de impresora Propósito
dmScale Especifica el porcentaje por el que se va a escalar la imagen para imprimir.
dmCopies Especifica el número de copias que se van a imprimir.
dmColor Especifica si una impresora de color debe imprimir color o monocromo.
dmOrientation Especifica la orientación del papel, ya sea vertical u horizontal.

En la tabla siguiente se enumeran varios miembros públicos de DEVMODEW que solo usan los controladores de pantalla:

Usado solo por controladores de pantalla Propósito
dmBitsPerPel Especifica la resolución de color, en bits por píxel, del dispositivo de visualización.
dmPelsWidth Especifica el ancho, en píxeles, de la superficie del dispositivo visible.
dmPelsHeight Especifica el alto, en píxeles, de la superficie del dispositivo visible.
dmDisplayFlags Especifica el modo de presentación: color frente a monocromo, entrelazado frente a no entrelazado.
dmDisplayFrequency Especifica, en hercios, la frecuencia de actualización de la pantalla.

En la tercera tabla se enumeran varios miembros públicos de DEVMODEW que usan los controladores de impresora y visualización:

Usado por los controladores de impresora y visualización Propósito
dmDeviceName En el caso de las pantallas, especifica el archivo DLL del controlador de pantalla. Para las impresoras, especifica el "nombre descriptivo" de la impresora.
dmFields Especifica las marcas de bits que identifican cuáles de los miembros DEVMODEW que siguen están en uso. Por ejemplo, la marca DM_BITSPERPEL se establece cuando el miembro dmBitsPerPel contiene datos válidos .
dmSize Especifica el tamaño, en bytes, de la parte pública de la estructura DEVMODEW.
dmDriverExtra Especifica el número de bytes de datos del controlador privado que siguen a los miembros de la estructura pública. En el caso de los controladores de pantalla, suele ser cero.