La structure DEVMODEW

La structure DEVMODEW est la version Unicode de la structure DEVMODE, qui est décrite dans la documentation Microsoft Windows SDK. (Le suffixe « W » sur DEVMODEW signifie « wide » ou caractères Unicode.) Bien que les applications puissent utiliser l’une ou l’autre structure, les pilotes sont requis pour utiliser la structure DEVMODEW plutôt que la structure DEVMODE.

Membres publics et privés

Immédiatement après les membres définis d’une structure DEVMODEW (souvent appelés membres DEVMODEW publics), il peut y avoir un ensemble de membres définis par le pilote (ses membres DEVMODEW privés). La figure suivante montre la section publique (la structure DEVMODEW elle-même) et la section privée.

Diagramme illustrant les sections publiques et privées de la structure DEVMODEW.

Normalement, les membres privés sont utilisés uniquement par les pilotes d’imprimante. Le pilote fournit la taille, en octets, de cette zone privée dans le membre dmDriverExtra . Les membres privés définis par le pilote sont destinés à une utilisation exclusive par le pilote.

Pour les pilotes d’imprimante, la structure DEVMODEW est utilisée pour spécifier les choix utilisateur pour un document d’impression. Il est également utilisé pour spécifier les valeurs par défaut de ces choix pour les imprimantes, telles que le nombre de copies à imprimer, le format du papier et d’autres attributs. Pour les périphériques d’affichage, la structure DEVMODEW spécifie des attributs d’affichage tels que le nombre de bits par pixel, les dimensions des pixels et la fréquence d’affichage.

Initialisation d’une structure DEVMODEW

Selon qu’elle doit être utilisée par un pilote d’affichage ou par un pilote d’imprimante, une structure DEVMODEW est initialisée de deux manières différentes.

  • Initialisation DEVMODEW du pilote d’affichage

    Le point d’entrée DrvGetModes d’un pilote d’affichage initialise tous les membres de la structure DEVMODEW à zéro. DrvGetModes copie ensuite le nom de la DLL du pilote d’affichage dans le membre dmDeviceName , renseigne les membres dmSpecVersion et dmDriverVersion avec la version de la structure DEVMODEW et copie les informations d’attributs d’affichage vers les membres appropriés.

  • Initialisation DEVMODEW du pilote d’imprimante

    Lorsqu’une application effectue un appel à DocumentProperties (une fonction DLL d’interface d’imprimante décrite dans la documentation Microsoft Windows SDK) ou À DrvDocumentPropertySheets (un DDI graphique de système d’exploitation basé sur NT), une structure DEVMODEW est créée avec les valeurs par défaut. Une application est alors libre de modifier l’un des membres DEVMODEW publics. Après toute modification, l’application doit ensuite effectuer un deuxième appel à la fonction qu’elle a appelée précédemment, afin de fusionner les membres modifiés avec ceux de la structure DEVMODEW interne du pilote. Le deuxième appel est nécessaire, car certaines modifications peuvent ne pas fonctionner correctement ; le pilote d’imprimante doit être appelé pour corriger la structure DEVMODEW. Lorsque le document est sur le point d’être imprimé, l’application transmet la structure DEVMODEW fusionnée à CreateDC (décrit dans la documentation Microsoft Windows SDK), qui la transmet au DDI DrvEnablePDEV. À ce moment-là, la DLL de rendu du pilote valide la structure DEVMODEW et effectue des réparations, si nécessaire, avant d’effectuer le travail d’impression.

Utilisation d’une structure DEVMODEW

Plusieurs API et DDIS graphiques utilisent les informations de la structure DEVMODEW à des fins telles que l’impression, l’interrogation des fonctionnalités des appareils, l’affichage de l’interface utilisateur, etc. Par exemple, DrvConvertDevMode est un DDI graphique spouleur d’impression qui traduit la structure DEVMODEW d’une version de système d’exploitation à une autre. Cela peut être nécessaire si un pilote d’imprimante obtient une structure DEVMODEW à partir d’un autre ordinateur qui s’exécute sur une autre version du système d’exploitation.

Modification d’une structure DEVMODEW

Les applications et les pilotes sont libres de demander une structure DEVMODEW et de modifier directement sa partie publique. Toutefois, seuls les pilotes sont autorisés à modifier les membres de la structure DEVMODEW privée.

Pour modifier les membres de structure DEVMODEW privés, un pilote doit d’abord déterminer le décalage du début des données privées. Avec un pointeur vers le début de cette structure et le membre dmSize , qui contient la taille de la partie publique de la structure, le début de la partie privée est trouvé. L’exemple suivant montre comment initialiser un pointeur vers le début de la section privée. Dans cet exemple, pdm pointe vers le début de la structure DEVMODEW.

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

Différences DEVMODEW entre le pilote d’imprimante et le pilote d’affichage

Les membres de la structure DEVMODEW se répartissent en trois catégories :

  • Membres utilisés uniquement par les pilotes d’imprimante

  • Membres utilisés uniquement par les pilotes d’affichage

  • Membres utilisés par les pilotes d’imprimante et d’affichage

Le tableau suivant répertorie plusieurs membres DEVMODEW publics qui sont utilisés uniquement par les pilotes d’imprimante :

Utilisé uniquement par les pilotes d’imprimante Objectif
dmScale Spécifie le pourcentage par lequel l’image doit être mise à l’échelle pour l’impression.
dmCopies Spécifie le nombre de copies à imprimer.
dmColor Spécifie si une imprimante couleur doit imprimer couleur ou monochrome.
dmOrientation Spécifie l’orientation du papier, portrait ou paysage.

Le tableau suivant répertorie plusieurs membres DEVMODEW publics qui sont utilisés uniquement par les pilotes d’affichage :

Utilisé uniquement par les pilotes d’affichage Objectif
dmBitsPerPel Spécifie la résolution de couleur, en bits par pixel, du périphérique d’affichage.
dmPelsWidth Spécifie la largeur, en pixels, de la surface visible de l’appareil.
dmPelsHeight Spécifie la hauteur, en pixels, de la surface visible de l’appareil.
dmDisplayFlags Spécifie le mode d’affichage : couleur ou monochrome, entrelacé ou non imbriqué.
dmDisplayFrequency Spécifie, en hertz, la fréquence d’actualisation de l’affichage.

Le troisième tableau répertorie plusieurs membres DEVMODEW publics qui sont utilisés par les pilotes d’imprimante et d’affichage :

Utilisé par les pilotes d’imprimante et d’affichage Objectif
dmDeviceName Pour les affichages, spécifie la DLL du pilote d’affichage. Pour les imprimantes, spécifie le « nom convivial » de l’imprimante.
dmFields Spécifie des indicateurs de bits identifiant les membres DEVMODEW qui suivent sont en cours d’utilisation. Par exemple, l’indicateur DM_BITSPERPEL est défini lorsque le membre dmBitsPerPel contient des données valides .
dmSize Spécifie la taille, en octets, de la partie publique de la structure DEVMODEW.
dmDriverExtra Spécifie le nombre d’octets de données de pilote privé qui suivent les membres de la structure publique. Pour les pilotes d’affichage, il s’agit généralement de zéro.