Verwenden von GDI-Funktionen in Druckprozessoren

Eine Reihe von GDI-Funktionen im Benutzermodus wird von Gdi32.dll exportiert, um sie von Druckprozessoren zu verwenden, die die EMF des NT-basierten Betriebssystems als Eingabeformat verarbeiten. In der folgenden Tabelle sind die bereitgestellten Funktionen aufgeführt.

Funktionsname BESCHREIBUNG
GdiDeleteSpoolFileHandle Gibt ein Spooldateihandle frei.
GdiEndDocEMF Schließt EMF-Wiedergabevorgänge für ein Druckauftragsdokument ab.
GdiEndPageEMF Schließt EMF-Wiedergabevorgänge für eine physische Seite ab und wirft die Seite aus dem Drucker aus.
GdiGetDC Gibt ein Handle für den Gerätekontext des Druckers zurück.
GdiGetDevmodeForPage Gibt die DEVMODEW-Struktur einer Dokumentseite zurück.
GdiGetPageCount Gibt die Anzahl der Dokumentseiten zurück.
GdiGetPageHandle Gibt ein Handle für eine Dokumentseite zurück.
GdiGetSpoolFileHandle Gibt ein Spooldateihandle zurück, das als Eingabe für die anderen GDI-Funktionen erforderlich ist.
GdiPlayPageEMF Gibt die EINER Dokumentseite zugeordneten EMF-Datensätze wieder.
GdiResetDCEMF Setzt den Gerätekontext eines Druckers zurück.
GdiStartDocEMF Führt Initialisierungsvorgänge für das Druckauftragsdokument aus.
GdiStartPageEMF Führt Initialisierungsvorgänge für eine physische Seite aus.

Der PrintDocumentOnPrintProcessor eines EMF-Druckprozessors sollte GdiGetSpoolFileHandle aufrufen, um ein Spooldateihandle und GdiGetDC das Gerätekontexthandle des Druckers abzurufen. Anschließend kann er die folgenden Schritte ausführen:

  • Für jedes Druckauftragsdokument muss GdiStartDocEMF aufgerufen werden, bevor EMF-Datensätze wiedergegeben werden, und GdiEndDocEMF muss aufgerufen werden, nachdem der letzte EMF-Eintrag wiedergegeben wurde.

  • Damit jede physische Seite gedruckt werden soll, muss GdiStartPageEMF aufgerufen werden, bevor Dokumentseiten auf der Seite gezeichnet werden, und GdiEndPageEMF muss aufgerufen werden, nachdem die letzte Dokumentseite auf der physischen Seite gezeichnet wurde.

  • Damit jede Dokumentseite auf einer physischen Seite gezeichnet werden soll, muss GdiGetDevmodeForPage aufgerufen werden, um zu bestimmen, ob sich der DEVMODE-Strukturinhalt seit dem Zeichnen der letzten Dokumentseite geändert hat. Wenn sich der DEVMODE geändert hat, muss eine neue physische Seite gestartet werden (durch Aufrufen von GdiEndPageEMF und GdiStartPageEMF), und der Gerätekontext des Druckers muss durch Aufrufen von GdiResetDCEMF aktualisiert werden. Eine Dokumentseite wird auf einer physischen Seite gezeichnet, indem zuerst GdiGetPageHandle aufgerufen wird, um ein Dokumentseitenhandle abzurufen, und dann GdiPlayPageEMF aufgerufen wird, um die Seite zu zeichnen.

Nachdem der Auftrag vollständig gezeichnet wurde, muss der Druckprozessor GdiDeleteSpoolFileHandle aufrufen.

Wenn ein Druckprozessor die Gesamtseitenanzahl erfordert, bevor er mit dem Drucken von Seiten beginnen kann (z. B. für das Drucken von Seiten in umgekehrter Reihenfolge), kann er GdiGetPageCount aufrufen, aber diese Funktion wird erst zurückgegeben, wenn das Spooling beendet ist, und deaktiviert daher die Möglichkeit, während des Spoolings zu drucken.

Wenn ein Druckprozessor diese GDI-Funktionen verwendet, muss seine EnumPrintProcessorDatatypes-Funktion "NT EMF" als unterstützten Datentyp zurückgeben, der das generische EMF-Format von Windows 2000 und höher darstellt. Der Druckprozessor darf EMF-Datensätze nicht ändern.