Eseguire il rendering di un processo di stampa
Importante
La piattaforma di stampa moderna è il mezzo preferito di Windows per comunicare con le stampanti. Ti consigliamo di usare il driver di classe 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 per stampanti.
Per altre informazioni, vedere Piattaforma di stampa moderna e guida alla progettazione dell'app di supporto per la stampa.
I processi di stampa vengono visualizzati durante la creazione o 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 all'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 .
Quando un'applicazione chiama la funzione CreateDC per creare un contesto di dispositivo della stampante, GDI verifica se la DLL grafica della stampante appropriata viene caricata. 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.
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.
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 fornito dal motore di disegno GDI (vedere GDI Support Services).
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.
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.
Se EngCreateBitmap non può fornire una bitmap sufficientemente grande da contenere un'intera pagina fisica e se il driver supporta il banding di pagine, È possibile chiamare EngMarkBandingSurface per informare GDI che verrà utilizzato il raggruppamento.
Infine, l'EngAssociateSurface deve essere chiamato per consentire a GDI di associare la superficie creata a un'istanza del dispositivo specificata e di comunicare a GDI quali funzioni di disegno DDI fornite dal driver devono essere chiamate 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.
Banding in uso
Per eseguire il rendering di ogni documento quando viene usata la banda, GDI chiama le funzioni seguenti nella DLL grafica della stampante:
Per ogni pagina fisica
Per ogni passaggio di raggruppamento in una pagina fisica
Operazioni di rendering
DrvNextBand // Inviare dati raster per questa banda, quindi cancellare la superficie da riutilizzare con la banda successiva
Banda non in uso
Per eseguire il rendering di ogni documento quando non viene usata la banda, GDI chiama le funzioni seguenti nella DLL grafica della stampante:
Per ogni pagina fisica
Operazioni di rendering
DrvSendPage // Inviare dati raster per la pagina
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, una pagina o 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 il raggruppamento di pagine è in uso, la funzione DrvNextBand deve inviare il contenuto della superficie di disegno. Se il raggruppamento 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 della grafica della stampante associa tutte le funzioni di disegno (vedere Negoziazione surface) e queste funzioni inviano dati di immagine alla stampante durante le operazioni di rendering. La bande di pagine non viene utilizzata.
Se si prevede che qualsiasi funzione DDI grafica fornita da una DLL grafica della stampante potrebbe richiedere potenzialmente più di cinque secondi per l'esecuzione, è 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 il rendering di un documento è stato completamente eseguito, 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 di quella precedente. Successivamente, DrvDisableSurface e DrvDisablePDEV vengono 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 .