Die DEVMODEW-Struktur

Die DEVMODEW-Struktur ist die Unicode-Version der DEVMODE-Struktur, die in der Microsoft Windows SDK-Dokumentation beschrieben wird. (Das Suffix "W" in DEVMODEW steht für "breit" oder Unicode-Zeichen.) Während Anwendungen beide Strukturen verwenden können, müssen Treiber die DEVMODEW-Struktur anstelle der DEVMODE-Struktur verwenden.

Öffentliche und private Mitglieder

Unmittelbar nach den definierten Membern einer DEVMODEW-Struktur (häufig als öffentliche DEVMODEW-Member bezeichnet) kann es eine Reihe von treiberdefinierte Membern (deren private DEVMODEW-Member) geben. Die folgende Abbildung zeigt den öffentlichen Abschnitt (die eigentliche DEVMODEW-Struktur selbst) und den privaten Abschnitt.

Diagramm zur Veranschaulichung der öffentlichen und privaten Abschnitte der DEVMODEW-Struktur.

Normalerweise werden die privaten Member nur von Druckertreibern verwendet. Der Treiber stellt die Größe dieses privaten Bereichs im dmDriverExtra-Element in Bytes bereit. Treiberdefinierte private Member sind für die exklusive Verwendung durch den Treiber bestimmt.

Bei Druckertreibern wird die DEVMODEW-Struktur verwendet, um Benutzeroptionen für ein Druckdokument anzugeben. Es wird auch verwendet, um Standardwerte dieser Auswahlmöglichkeiten für Drucker anzugeben, z. B. die Anzahl der zu druckenden Kopien, das Papierformat und andere Attribute. Für Anzeigegeräte gibt die DEVMODEW-Struktur Anzeigeattribute an, z. B. die Anzahl der Bits pro Pixel, Die Pixelabmessungen und die Anzeigefrequenz.

Initialisieren einer DEVMODEW-Struktur

Je nachdem, ob sie von einem Anzeigetreiber oder einem Druckertreiber verwendet werden soll, wird eine DEVMODEW-Struktur auf zwei verschiedene Arten initialisiert.

  • DevMODEW-Initialisierung des Anzeigetreibers

    Der DrvGetModes-Einstiegspunkt eines Anzeigetreibers initialisiert alle Member der DEVMODEW-Struktur auf null. DrvGetModes kopiert dann den Namen der Anzeigetreiber-DLL in das dmDeviceName-Element , füllt die dmSpecVersion - und dmDriverVersion-Member mit der Version der DEVMODEW-Struktur aus und kopiert die Angezeigten Attributinformationen an die entsprechenden Member.

  • Initialisierung des Druckertreibers DEVMODEW

    Wenn eine Anwendung documentProperties (eine DLL-Funktion der Druckerschnittstelle, die in der Microsoft Windows SDK Dokumentation beschrieben wird) oder DrvDocumentPropertySheets (eine NT-basierte Betriebssystemgrafik-DDI) aufruft, wird eine DEVMODEW-Struktur mit Standardwerten erstellt. Eine Anwendung kann dann alle öffentlichen DEVMODEW-Member ändern. Nach allen Änderungen sollte die Anwendung dann einen zweiten Aufruf derselben Funktion ausführen, die sie zuvor aufgerufen hat, um die geänderten Member mit denen der internen DEVMODEW-Struktur des Treibers zusammenzuführen. Der zweite Aufruf ist erforderlich, da einige Änderungen möglicherweise nicht ordnungsgemäß funktionieren. Der Druckertreiber muss aufgerufen werden, um die DEVMODEW-Struktur zu korrigieren. Wenn das Dokument gedruckt werden soll, übergibt die Anwendung die zusammengeführte DEVMODEW-Struktur an CreateDC (beschrieben in der Microsoft Windows SDK-Dokumentation), das es an drvEnablePDEV DDI weitergibt. Zu diesem Zeitpunkt überprüft die Rendering-DLL des Treibers die DEVMODEW-Struktur und führt ggf. Reparaturen durch, bevor der Druckauftrag ausgeführt wird.

Verwenden einer DEVMODEW-Struktur

Mehrere APIs und Grafik-DDIs verwenden die Informationen in der DEVMODEW-Struktur für Zwecke wie Drucken, Abfragen von Gerätefunktionen, Anzeigen der Benutzeroberfläche und andere. Beispielsweise ist DrvConvertDevMode ein DDI für Druckspoolergrafiken, der die DEVMODEW-Struktur von einer Betriebssystemversion in eine andere übersetzt. Dies kann erforderlich sein, wenn ein Druckertreiber eine DEVMODEW-Struktur von einem anderen Computer abruft, der unter einer anderen Betriebssystemversion ausgeführt wird.

Ändern einer DEVMODEW-Struktur

Anwendungen und Treiber können eine DEVMODEW-Struktur anfordern und ihren öffentlichen Teil direkt ändern. Nur Treiber dürfen jedoch die privaten DEVMODEW-Strukturmember ändern.

Um private DEVMODEW-Strukturmember zu ändern, muss ein Treiber zunächst den Offset des Anfangs der privaten Daten bestimmen. Mit einem Zeiger auf den Anfang dieser Struktur und dem dmSize-Member , der die Größe des öffentlichen Teils der Struktur enthält, kann der Anfang des privaten Teils gefunden werden. Das folgende Beispiel zeigt, wie Sie einen Zeiger auf den Anfang des privaten Abschnitts initialisieren. In diesem Beispiel zeigt pdm auf den Anfang der DEVMODEW-Struktur.

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

Unterschiede beim Druckertreiber/Anzeigetreiber DEVMODEW

Die DEVMODEW-Strukturmember lassen sich in drei Kategorien einteilen:

  • Elemente, die nur von Druckertreibern verwendet werden

  • Elemente, die nur von Anzeigetreibern verwendet werden

  • Von Drucker- und Anzeigetreibern verwendete Member

In der folgenden Tabelle sind mehrere öffentliche DEVMODEW-Member aufgeführt, die nur von Druckertreibern verwendet werden:

Nur von Druckertreibern verwendet Zweck
dmScale Gibt den Prozentsatz an, um den das Bild zum Drucken skaliert werden soll.
dmCopies Gibt die Anzahl der zu druckenden Kopien an.
dmColor Gibt an, ob ein Farbdrucker Farbe oder monochrom drucken soll.
dmOrientation Gibt die Ausrichtung des Papiers im Hoch- oder Querformat an.

In der nächsten Tabelle sind mehrere öffentliche DEVMODEW-Member aufgeführt, die nur von Anzeigetreibern verwendet werden:

Nur von Anzeigetreibern verwendet Zweck
dmBitsPerPel Gibt die Farbauflösung des Anzeigegeräts in Bits pro Pixel an.
dmPelsWidth Gibt die Breite der sichtbaren Geräteoberfläche in Pixel an.
dmPelsHeight Gibt die Höhe der sichtbaren Geräteoberfläche in Pixel an.
dmDisplayFlags Gibt den Anzeigemodus an: Farbe im Vergleich zu monochromen, interlaced oder noninterlaced.
dmDisplayFrequency Gibt in Hertz die Aktualisierungsrate der Anzeige an.

In der dritten Tabelle sind mehrere öffentliche DEVMODEW-Member aufgeführt, die sowohl von Drucker- als auch Anzeigetreibern verwendet werden:

Wird von Drucker- und Anzeigetreibern verwendet Zweck
dmDeviceName Gibt für Anzeigen die DLL des Anzeigetreibers an. Gibt für Drucker den "Anzeigenamen" des Druckers an.
dmFields Gibt Bitflags an, mit denen angegeben wird, welche devMODEW-Member darauf folgen. Beispielsweise wird das flag DM_BITSPERPEL festgelegt, wenn das dmBitsPerPel-Element gültige Daten enthält.
dmSize Gibt die Größe des öffentlichen Teils der DEVMODEW-Struktur in Bytes an.
dmDriverExtra Gibt die Anzahl der Byte privater Treiberdaten an, die den öffentlichen Strukturmembern folgen. Bei Anzeigetreibern ist dies in der Regel null.