Share via


Rendern eines Druckauftrags

Wichtig

Es wird empfohlen, den IPP-Posteingangsklassentreiber von Microsoft zusammen mit Druckunterstützungs-Apps (PSA) zu verwenden, um die Druckoberfläche in Windows 10 und 11 für die Druckergeräteentwicklung anzupassen.

Weitere Informationen finden Sie im Designhandbuch für Druckunterstützungs-Apps.

Druckaufträge werden entweder beim Erstellen gerendert oder als EMF-Datensätze in eine Spooldatei geschrieben. Bei EMF-Datensätzen erfolgt das Rendering, wenn der EMF-Druckprozessor (localspl.dll) die Datensätze wiedergibt. 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 Kette von Aktionen führen, die die Grafikrendering-Engine (GRE, auch bekannt als Kernelmodus-GDI) und die Druckergrafik-DLL betreffen.

Die folgende Abbildung zeigt die Interaktion zwischen Kernelmodus-GDI und der Druckergrafik-DLL nach dem Aufruf von CreateDC .

Diagramm, das die Interaktion zwischen Kernelmodus gdi und der Druckergrafik-DLL nach dem Aufruf von createdc veranschaulicht.

  1. Wenn eine Anwendung die CreateDC-Funktion aufruft, um einen Druckergerätekontext zu erstellen, überprüft GDI, ob die entsprechende Druckergrafik-DLL geladen ist. 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.

  2. Als Nächstes ruft GDI die DrvEnablePDEV-Funktion der Druckergrafik-DLL auf, damit der Treiber ein physisches Gerät instance erstellen und Geräteeigenschaften zurückgeben kann. GDI verwendet die zurückgegebenen Informationen, um eine interne Beschreibung des Geräts instance zu erstellen.

  3. GDI ruft dann die DrvCompletePDEV-Funktion der Grafik-DLL auf, um dem Gerät instance ein GDI-Handle zur Verfügung zu stellen. Die Grafik-DLL muss dieses Handle als Eingabe für einige der von der GDI-Zeichnungs-Engine bereitgestellten Eng-Präfix-Rückrufe verwenden (siehe GDI-Supportdienste).

  4. Nachdem GDI das Gerät instance Handle empfangen hat, ruft es dann die DrvEnableSurface-Funktion der Grafik-DLL auf, die die Oberfläche für das Zeichnen eingerichtet und dem physischen Gerät instance ordnet.

  5. Der Treiber kann eine Zeichnungsoberfläche für das Gerät instance erstellen, indem er EngCreateBitmap aufruft. Wenn die Zeichnungsoberfläche geräteseitig verwaltet wird, kann der Treiber auch EngCreateDeviceSurface aufrufen.

  6. Wenn EngCreateBitmap keine Bitmap bereitstellen kann, die groß genug ist, 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.

  7. Schließlich muss die EngAssociateSurface aufgerufen werden, damit GDI die erstellte Oberfläche einem angegebenen Gerät instance zuordnen kann, und um GDI mitzuteilen, welche vom Treiber bereitgestellten Grafik-DDI-Zeichnungsfunktionen (falls vorhanden) aufgerufen werden sollen, wenn es auf dieser bestimmten Oberfläche zeichnet.

An diesem Punkt wurde eine Zeichnungsoberfläche erstellt, und das Rendern kann beginnen. Welche Funktionen GDI aufruft, hängt davon ab, ob eine Bandierung wirksam ist.

Verwendete Bandierung

Für jedes Dokument, das beim Verwenden von Banding gerendert werden soll, ruft GDI die folgenden Funktionen in der Druckergrafik-DLL auf:

DrvStartDoc

Für jede physische Seite

DrvStartPage

DrvStartBanding

Für jeden Bandingdurchlauf auf einer physischen Seite

DrvQueryPerBandInfo

Rendervorgänge

DrvNextBand // Senden sie Rasterdaten für dieses Band, und löschen Sie dann die Oberfläche, um sie mit dem nächsten Band wiederzuverwenden

DrvEndDoc

Nicht verwendete Banding

Damit jedes Dokument gerendert werden soll, wenn das Banding nicht verwendet wird, ruft GDI die folgenden Funktionen in der Druckergrafik-DLL auf:

DrvStartDoc

Für jede physische Seite

DrvStartPage

Rendervorgänge

DrvSendPage // Rasterdaten für die Seite senden

DrvEndDoc

Mit Ausnahme von DrvQueryPerBandInfo sollen diese Funktionen es der Druckergrafik-DLL ermöglichen, Steuersequenzen an die Druckerhardware zu senden (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 für das Senden des gerenderten Bilds (d. a. des Inhalts der Zeichnungsoberfläche) an den Drucker zu geeigneten Zeiten (durch Aufrufen von EngWritePrinter) wie folgt verantwortlich:

  • Für von GDI verwaltete oder geräteverwaltete Bitmapoberflächen

    Die Zeichnungsoberfläche ist eine von GDI bereitgestellte oder vom Treiber bereitgestellte Bitmap. Die Druckergrafik-DLL kann einige Zeichenfunktionen einbinden (siehe Surface-Aushandlung). Wenn seitenbanding verwendet wird, sollte die DrvNextBand-Funktion Den Inhalt der Zeichnungsoberfläche senden. Wenn die Bandierung nicht 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 bindet alle Zeichnungsfunktionen (siehe Surface Negotiation) ein, und diese Funktionen senden Bilddaten an den Drucker während des Renderingvorgangs. Seitenbanding wird nicht verwendet.

Wenn Sie davon ausgehen, dass die Ausführung einer Grafik-DDI-Funktion, die von einer Druckergrafik-DLL bereitgestellt wird, möglicherweise mehr als fünf Sekunden dauern kann, sollten Sie Code einschließen, der EngCheckAbort mindestens alle fünf Sekunden aufruft, um zu ermitteln, ob der Druckauftrag beendet werden soll.

Nachdem GDI DrvEndDoc aufgerufen hat, um anzugeben, dass ein Dokument vollständig gerendert wurde, wird DrvDisableSurface aufgerufen. Wenn DrvEnableSurfaceEngCreateBitmap aufgerufen hat, muss DrvDisableSurfaceEngDeleteSurface aufrufen.

GDI ruft die DrvDisablePDEV-Funktion einer Druckergrafik-DLL auf, wenn eine Anwendung DeleteDC aufruft.

Wenn eine Anwendung während des Druckens eines Dokuments die ResetDC-Funktion aufruft, erstellt GDI einen neuen Gerätekontext und ruft die DrvEnablePDEV-Funktion der Druckergrafik-DLL für den neuen Kontext auf. Dann ruft GDI die DrvResetPDEV-Funktion auf, damit die Grafik-DLL den neuen Kontext mit Informationen aus dem 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 rendert Lebensläufe auf einer neuen Seite.

GDI ruft DrvDisableDriver auf, bevor die Druckergrafik-DLL entladen wird.

Wenn die 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 dies erforderlich ist, um Zeichnungs- oder Nichtzeichnungsvorgänge zu unterstützen, die nicht über GDI-Funktionen verfügbar sind. Der Microsoft PostScript-Druckertreiber verwendet beispielsweise Escapes, um PostScript-Einspritzpunkte zu unterstützen. Oder eine Anwendung muss möglicherweise die Telefonnummer eines Faxgeräts abrufen. Die DrvEscape-Funktion wird auch verwendet, um die von der DrvDrawEscape-Funktion unterstützten Vorgänge anzugeben.