Eseguire il rendering di un processo di stampa

Importante

È consigliabile usare il driver di classe posta in arrivo IPP di Microsoft, insieme a Print Support Apps (PSA), per personalizzare l'esperienza di stampa in Windows 10 e 11 per lo sviluppo di dispositivi della stampante.

Per altre informazioni, vedere la guida alla progettazione dell'app di supporto per la stampa.

I processi di stampa vengono visualizzati durante la creazione oppure vengono scritti in un file di spooling come record EMF. Nel caso dei record EMF, il rendering viene eseguito quando il processore di stampa EMF (localspl.dll) riproduce i record. Il rendering è costituito da una serie di chiamate alle funzioni di disegno GDI in modalità utente, a partire da CreateDC. La chiamata a CreateDC è la prima in una serie di chiamate dell'applicazione che portano a una catena di azioni che coinvolgono il motore di rendering grafico (GRE, noto anche come GDI in modalità kernel) e la DLL grafica della stampante.

La figura seguente illustra l'interazione tra GDI in modalità kernel e la DLL grafica della stampante dopo la chiamata a CreateDC .

diagramma che illustra l'interazione tra gdi in modalità kernel e la dll grafica della stampante dopo la chiamata di createdc.

  1. Quando un'applicazione chiama la funzione CreateDC per creare un contesto di dispositivo della stampante, GDI verifica se viene caricata la DLL grafica della stampante appropriata. In caso contrario, GDI carica la DLL e chiama la funzione DrvEnableDriver nella DLL. La funzione non viene chiamata di nuovo a meno che il driver non venga ricaricato.

  2. Successivamente, GDI chiama la funzione DrvEnablePDEV della DLL grafica della stampante in modo che il driver possa creare un'istanza del dispositivo fisico e restituire le caratteristiche del dispositivo. GDI usa le informazioni restituite per creare una descrizione interna dell'istanza del dispositivo.

  3. GDI chiama quindi la funzione DrvCompletePDEV della DLL grafica per fornire un handle GDI all'istanza del dispositivo. La DLL grafica deve usare questo handle come input per alcuni dei callback con prefisso Eng forniti dal motore di disegno GDI (vedere Servizi di supporto GDI).

  4. Dopo che GDI riceve l'handle dell'istanza del dispositivo, effettua una chiamata alla funzione DrvEnableSurface della DLL grafica, che configura la superficie per il disegno e la associa all'istanza del dispositivo fisico.

  5. Il driver può creare una superficie di disegno per l'istanza del dispositivo chiamando EngCreateBitmap. In alternativa, se la superficie di disegno è gestita dal dispositivo, il driver può chiamare EngCreateDeviceSurface.

  6. Se EngCreateBitmap non è in grado di fornire una bitmap sufficientemente grande da contenere un'intera pagina fisica e se il driver supporta la banda delle pagine, È possibile chiamare EngMarkBandingSurface per informare GDI che verrà utilizzato il banding.

  7. Infine, È necessario chiamare EngAssociateSurface per consentire a GDI di associare la superficie creata a un'istanza del dispositivo specificata e di informare GDI quali funzioni di disegno DDI grafica fornite dal driver (se presenti) devono chiamare quando disegna su questa particolare superficie.

A questo punto, è stata creata una superficie di disegno e il rendering può iniziare. Le funzioni chiamate da GDI dipendono dal fatto che la banda sia attiva.

Raggruppamento in uso

Per eseguire il rendering di ogni documento quando viene utilizzato il raggruppamento, GDI chiama le funzioni seguenti nella DLL grafica della stampante:

DrvStartDoc

Per ogni pagina fisica

DrvStartPage

DrvStartBanding

Per ogni passaggio di banda su una pagina fisica

DrvQueryPerBandInfo

Operazioni di rendering

DrvNextBand // Invia dati raster per questa banda, quindi cancella la superficie per riutilizzare con la banda successiva

DrvEndDoc

Banda non in uso

Per il rendering di ogni documento quando non viene utilizzato il raggruppamento, GDI chiama le funzioni seguenti nella DLL grafica della stampante:

DrvStartDoc

Per ogni pagina fisica

DrvStartPage

Operazioni di rendering

DrvSendPage // Invia dati raster per la pagina

DrvEndDoc

Ad eccezione di DrvQueryPerBandInfo, queste funzioni sono destinate a consentire alla DLL grafica della stampante di inviare sequenze di controllo all'hardware della stampante (chiamando EngWritePrinter) e per eseguire qualsiasi operazione interna necessaria per inizializzare o completare l'elaborazione di un documento, di una pagina o di una banda.

La DLL grafica della stampante è responsabile dell'invio dell'immagine di cui è stato eseguito il rendering (ovvero il contenuto della superficie di disegno) alla stampante in momenti appropriati (chiamando EngWritePrinter), come indicato di seguito:

  • Per le superfici bitmap gestite da GDI o gestite dal dispositivo

    La superficie di disegno è una bitmap fornita da GDI o fornita dal driver. La DLL grafica della stampante potrebbe associare alcune funzioni di disegno (vedere Negoziazione surface). Se è in uso la banda delle pagine, la funzione DrvNextBand deve inviare il contenuto della superficie di disegno. Se la banda non è in uso, la funzione DrvSendPage deve inviare il contenuto della superficie di disegno.

  • Per le superfici vettoriali gestite dal dispositivo

    La superficie di disegno si trova all'interno del dispositivo. La DLL grafica della stampante associa tutte le funzioni di disegno (vedere Negoziazione surface) e queste funzioni inviano i dati dell'immagine alla stampante durante le operazioni di rendering. La banda delle pagine non viene utilizzata.

Se si prevede che l'esecuzione di qualsiasi funzione DDI grafica fornita da una DLL grafica della stampante potrebbe richiedere più di cinque secondi, è necessario includere codice che chiama EngCheckAbort almeno ogni cinque secondi per verificare se il processo di stampa deve essere terminato.

Dopo che GDI chiama DrvEndDoc per indicare che è stato completamente eseguito il rendering di un documento, chiama DrvDisableSurface. Se DrvEnableSurface chiamato EngCreateBitmap, DrvDisableSurface deve chiamare EngDeleteSurface.

GDI chiama la funzione DrvDisablePDEV di una DLL grafica della stampante quando un'applicazione chiama DeleteDC.

Se un'applicazione chiama la funzione ResetDC durante la stampa di un documento, GDI crea un nuovo contesto di dispositivo e chiama la funzione DrvEnablePDEV della DLL grafica della stampante per il nuovo contesto. GDI chiama quindi la funzione DrvResetPDEV , in modo che la DLL grafica possa aggiornare il nuovo contesto con le informazioni del vecchio. Successivamente, DrvDisableSurface e DrvDisablePDEV sono chiamati per il contesto precedente, seguito da DrvEnableSurface per il nuovo contesto. Infine, GDI chiama DrvStartDoc e il rendering riprende in una nuova pagina.

GDI chiama DrvDisableDriver prima di scaricare la DLL grafica della stampante.

Se l'hardware della stampante supporta operazioni di disegno non supportate dalle funzioni di disegno GDI, la DLL grafica della stampante può fornire una funzione DrvDrawEscape .

Una DLL grafica della stampante può fornire una funzione DrvEscape se è necessario supportare operazioni di disegno o non ridisegno non disponibili tramite funzioni GDI. Ad esempio, il driver della stampante Microsoft PostScript usa escape per supportare i punti di inserimento PostScript. In alternativa, un'applicazione potrebbe dover ottenere il numero di telefono di un computer fax. La funzione DrvEscape viene usata anche per indicare le operazioni supportate dalla funzione DrvDrawEscape .