Rendern eines Druckauftrags
Wichtig
Die Modern Print-Plattform ist die von Windows bevorzugte Methode zur Kommunikation mit Druckern. Wir empfehlen die Verwendung des Microsoft IPP-Treibers für die Posteingangsklasse zusammen mit Print Support Apps (PSA), um das Druckverhalten in Windows 10 und 11 für die Entwicklung von Druckergeräten anzupassen.
Weitere Informationen finden Sie unter Modern Print-Plattform und der Anleitung zum Design der Print-Support-App.
Druckaufträge werden entweder gerendert, während sie erstellt werden, oder sie werden als EMF-Datensätze in eine Spooldatei geschrieben. Bei EMF-Datensätzen erfolgt das Rendering bei der Wiedergabe der Datensätze durch den EMF-Druckprozessor (localspl.dll). Das Rendern besteht aus einer Reihe von Aufrufen der GDI-Zeichnungsfunktionen im Benutzermodus, beginnend mit CreateDC. Der Aufruf von CreateDC ist der erste in einer Reihe von Anwendungsaufrufen, die zu einer Reihe von Aktionen führen, die das Grafikrenderingmodul (GRE, auch als Kernelmodus GDI bezeichnet) und die Druckergrafik-DLL umfassen.
Die folgende Abbildung zeigt die Interaktion zwischen Kernelmodus GDI und der Druckergrafik-DLL, nachdem CreateDC aufgerufen wurde.
Wenn eine Anwendung die CreateDC-Funktion aufruft, um einen Druckergerätekontext zu erstellen, überprüft GDI, ob die entsprechende Druckergrafik-DLL geladen wird. Andernfalls lädt GDI die DLL und ruft die DrvEnableDriver-Funktion in der DLL auf. Die Funktion wird nicht erneut aufgerufen, es sei denn, der Treiber wird neu geladen.
Als Nächstes ruft GDI die Funktion DrvEnablePDEV der Druckergrafik-DLL auf, damit der Treiber eine physische Geräteinstanz erstellen und Geräteeigenschaften zurückgeben kann. GDI verwendet die zurückgegebenen Informationen, um eine interne Beschreibung der Geräteinstanz zu erstellen.
GDI ruft dann die Funktion DrvCompletePDEV der Grafik-DLL auf, um der Geräteinstanz einen GDI-Handle bereitzustellen. Die Grafik-DLL muss dieses Handle als Eingabe für einige der Eng-präfixierten Rückrufe verwenden, die vom GDI-Zeichenmodul bereitgestellt werden (siehe GDI-Supportdienste).
Nachdem GDI den Geräteinstanz-Handle erhalten hat, ruft es die Funktion DrvEnableSurface der Grafik-DLL auf, die die Oberfläche zum Zeichnen einrichtet und sie der physischen Geräteinstanz zuordnet.
Der Treiber kann eine Zeichnungsoberfläche für die Geräteinstanz erstellen, indem EngCreateBitmap aufgerufen wird. Wenn die Zeichnungsoberfläche geräteverwaltet ist, kann der Treiber EngCreateDeviceSurface aufrufen.
Wenn EngCreateBitmap eine Bitmap nicht groß genug bereitstellen kann, um eine gesamte physische Seite zu enthalten, und wenn der Treiber Seitenbanding unterstützt, kann EngMarkBandingSurface aufgerufen werden, um GDI darüber zu informieren, dass banding verwendet wird.
Schließlich muss die EngAssociateSurface aufgerufen werden, damit GDI die erstellte Oberfläche einer angegebenen Geräteinstanz zuordnen kann, und GDI informiert, welche DDI-Grafik-Zeichnungsfunktionen (falls vorhanden) beim Zeichnen auf dieser bestimmten Oberfläche aufgerufen werden sollen.
Zu diesem Zeitpunkt wurde eine Zeichnungsoberfläche erstellt, und das Rendern kann beginnen. Die Funktionen, die GDI aufruft, hängen davon ab, ob das Banding wirksam ist.
Bändern in Verwendung
Damit jedes Dokument gerendert wird, wenn Banding verwendet wird, ruft GDI die folgenden Funktionen in der Druckergrafik-DLL auf:
Für jede physische Seite
Für jeden Banddurchlauf auf einer physischen Seite
Renderoperationen:
DrvNextBand // Rasterdaten für dieses Band senden und dann die Oberfläche löschen, um sie mit dem nächsten Band wiederzuverwenden
Nicht verwendetes Banden
Damit jedes Dokument gerendert wird, wenn Banding nicht verwendet wird, ruft GDI die folgenden Funktionen in der Druckergrafik-DLL auf:
Für jede physische Seite
Renderoperationen:
DrvSendPage // Rasterdaten für die Seite senden
Mit Ausnahme von DrvQueryPerBandInfo sind diese Funktionen dazu gedacht, der Grafik-DLL des Druckers das Senden von Steuersequenzen an die Druckerhardware zu ermöglichen (durch Aufrufen von EngWritePrinter) und alle internen Vorgänge auszuführen, die zum Initialisieren oder Abschließen der Verarbeitung eines Dokuments, einer Seite oder eines Bandes erforderlich sind.
Die Druckergrafik-DLL ist dafür verantwortlich, das gerenderte Bild (d. a. den Inhalt der Zeichnungsoberfläche) zu geeigneten Zeiten (durch Aufrufen von EngWritePrinter) an den Drucker zu senden:
Für GDI-verwaltete oder geräteverwaltete Bitmapoberflächen
Die Zeichnungsoberfläche ist eine vom GDI bereitgestellte oder vom Treiber bereitgestellte Bitmap. Die Druckergrafik-DLL kann einige Zeichenfunktionen einbinden (siehe Surface-Aushandlung). Wenn ein Seitenband verwendet wird, sollte die DrvNextBand-Funktion Zeichnungsoberflächeninhalte senden. Wenn kein Band verwendet wird, sollte die DrvSendPage-Funktion den Inhalt der Zeichnungsoberfläche senden.
Für geräteverwaltete Vektoroberflächen
Die Zeichnungsoberfläche befindet sich innerhalb des Geräts. Die Druckergrafik-DLL hooks alle Zeichenfunktionen (siehe Surface Negotiation), und diese Funktionen senden Bilddaten während des Renderingvorgangs an den Drucker. Seitenband wird nicht verwendet.
Wenn Sie davon ausgehen, dass die Ausführung einer von einer Druckergrafik-DLL bereitgestellten Grafik-DDI-Funktion möglicherweise länger als fünf Sekunden dauert, sollten Sie Code einfügen, der mindestens alle fünf Sekunden EngCheckAbort aufruft, um zu prüfen, ob der Druckauftrag beendet werden soll.
Nachdem GDI DrvEndDoc aufgerufen hat, um anzuzeigen, dass ein Dokument vollständig gerendert wurde, ruft es DrvDisableSurface auf. Wenn DrvEnableSurface EngCreateBitmapaufruft muss DrvDisableSurface EngDeleteSurface aufrufen.
GDI ruft die Funktion DrvDisablePDEV einer Druckergrafik-DLL auf, wenn eine Anwendung DeleteDC aufruft.
Wenn eine Anwendung während des Druckens eines Dokuments die Funktion ResetDC aufruft, erstellt GDI einen neuen Gerätekontext und ruft die Funktion DrvEnablePDEV der Druckergrafik-DLL für den neuen Kontext auf. Dann ruft GDI die DrvResetPDEV-Funktion auf, sodass die Grafik-DLL den neuen Kontext mit Informationen aus der alten aktualisieren kann. Als nächstes werden DrvDisableSurface und DrvDisablePDEV für den alten Kontext aufgerufen, gefolgt von DrvEnableSurface für den neuen Kontext. Schließlich ruft GDI DrvStartDoc auf und das Rendern wird auf einer neuen Seite fortgesetzt.
GDI ruft DrvDisableDriver vor dem Entladen der Druckergrafik-DLL auf.
Wenn Druckerhardware Zeichnungsvorgänge unterstützt, die von GDI-Zeichnungsfunktionen nicht unterstützt werden, kann die Druckergrafik-DLL eine DrvDrawEscape-Funktion bereitstellen.
Eine Druckergrafik-DLL kann eine DrvEscape-Funktion bereitstellen, wenn es erforderlich ist, Zeichnungs- oder Nichtzeichnungsvorgänge zu unterstützen, die nicht über GDI-Funktionen verfügbar sind. Der Microsoft PostScript-Druckertreiber verwendet z. B. Escapezeichen zur Unterstützung von PostScript-Einfügepunkten. Oder eine Anwendung muss möglicherweise die Telefonnummer eines Faxgeräts abrufen. Die DrvEscape-Funktion wird auch verwendet, um die Vorgänge anzugeben, die von der DrvDrawEscape-Funktion unterstützt werden.