轉譯列印作業
重要
新式列印平臺是 Windows 與印表機通訊的慣用方法。 我們建議您使用Microsoft的 IPP 收件匣類別驅動程式,以及列印支援應用程式 (PSA),自定義 Windows 10 和 11 中的列印體驗,以進行印表機裝置開發。
如需詳細資訊,請參閱 新式列印平臺 和 列印支援應用程式設計指南。
列印作業會在建立時轉譯,或以EMF記錄的形式寫入多任務緩衝處理檔案。 在EMF記錄的情況下,當EMF 列印處理器 (localspl.dll) 播放記錄時,就會進行轉譯。 轉譯是由使用者模式 GDI 繪圖函式的一系列呼叫所組成,從 CreateDC 開始。 呼叫 CreateDC 是一系列應用程式呼叫中的第一個,導致圖形轉譯引擎(GRE,也稱為內核模式 GDI)和列印機圖形 DLL 的動作鏈結。
下圖顯示呼叫 CreateDC 之後,核心模式 GDI 與印表機圖形 DLL 之間的互動。
當應用程式呼叫 CreateDC 函式來建立印表機裝置內容時,GDI 會檢查是否已載入適當的印表機圖形 DLL。 如果不是,GDI 會載入 DLL,並在 DLL 中呼叫 DrvEnableDriver 函 式。 除非重載驅動程式,否則不會再次呼叫 函式。
接下來,GDI 會呼叫印表機圖形 DLL 的 DrvEnablePDEV 函式,讓驅動程式可以建立實體裝置實例並傳回裝置特性。 GDI 會使用傳回的資訊來建立裝置實例的內部描述。
GDI 接著會呼叫圖形 DLL 的 DrvCompletePDEV 函式,以提供 GDI 句柄給裝置實例。 圖形 DLL 必須使用這個句柄作為 GDI 繪圖引擎所提供的一些 Eng 前置回呼的輸入(請參閱 GDI 支援服務)。
GDI 收到裝置實例句柄之後,接著會呼叫圖形 DLL 的 DrvEnableSurface 函式,該函式會設定繪製介面,並將它與實體裝置實例產生關聯。
驅動程式可以呼叫 EngCreateBitmap,為裝置實例建立繪圖介面。 或者,如果繪圖表面是裝置管理的,驅動程式可以呼叫 EngCreateDeviceSurface。
如果 EngCreateBitmap 無法提供足以包含整個實體頁面的點陣圖,而且如果驅動程式支援分頁帶狀, 則可以呼叫 EngMarkBandingSurface 來通知 GDI 使用帶狀結構。
最後, 必須呼叫 EngAssociateSurface ,以允許 GDI 將建立的介面與指定的裝置實例產生關聯,並讓 GDI 知道哪個驅動程式提供的圖形 DDI 繪圖函式(如果有的話),它應該在此特定表面上繪製時呼叫它。
此時,已建立繪圖介面並開始轉譯。 GDI 呼叫的函式取決於帶狀是否有效。
使用中的頻帶
針對使用帶狀時要轉譯的每個檔,GDI 會在印表機圖形 DLL 中呼叫下列函式:
針對每個實體頁面
針對實體頁面上的每個帶狀傳遞
轉譯作業
DrvNextBand - 傳送此波段的點陣數據,然後清除表面以用於下一個頻帶重複使用
頻帶不在使用中
若未使用帶狀時要轉譯的每個檔,GDI 會在印表機圖形 DLL 中呼叫下列函式:
針對每個實體頁面
轉譯作業
DrvSendPage - 傳送頁面的點陣數據
除了DrvQueryPerBandInfo之外,這些函式的目的是允許印表機圖形 DLL 將控制序列傳送至印表機硬體(藉由呼叫 EngWritePrinter),以及執行初始化或完成文件、頁面或頻帶處理所需的任何內部作業。
印表機圖形 DLL 負責在適當時間將轉譯的影像(也就是繪圖表面的內容)傳送至列印機(呼叫 EngWritePrinter),如下所示:
針對 GDI 管理或裝置管理的點陣圖介面
繪圖介面是 GDI 提供的或驅動程式提供的點陣圖。 印表機圖形 DLL 可能會連結一些繪圖函式(請參閱 Surface 交涉)。 如果分頁帶正在使用中, DrvNextBand 函式應該會傳送繪圖介面內容。 如果未使用帶狀, DrvSendPage 函式應該會傳送繪圖介面內容。
適用於裝置管理的向量表面
繪圖介面位於裝置內。 印表機圖形 DLL 會連結所有繪圖函式(請參閱 Surface 交涉),而且這些函式會在轉譯作業期間將影像數據傳送至印表機。 未使用分頁帶狀。
如果您預期印表機圖形 DLL 所提供的任何圖形 DDI 函式都可能需要超過五秒的時間才能執行,您應該包含至少每五秒呼叫 EngCheckAbort 的程式代碼,以查看列印作業是否應該終止。
GDI 呼叫DrvEndDoc以指出檔已完全轉譯之後,它會呼叫DrvDisableSurface。 如果DrvEnableSurface稱為 EngCreateBitmap,則DrvDisableSurface必須呼叫 EngDeleteSurface。
GDI 會在應用程式呼叫 DeleteDC 時呼叫印表機圖形 DLL 的 DrvDisablePDEV 函式。
如果應用程式在列印檔時呼叫 ResetDC 函式,GDI 會建立新的裝置內容,並針對新內容呼叫印表機圖形 DLL 的 DrvEnablePDEV 函式。 然後,GDI 會呼叫 DrvResetPDEV 函式,讓圖形 DLL 可以使用來自舊內容的資訊來更新新內容。 接下來,DrvDisableSurface 和DrvDisablePDEV會針對舊內容呼叫,後面接著DrvEnableSurface以取得新的內容。 最後,GDI 會呼叫 DrvStartDoc ,並在新的頁面上繼續轉譯。
GDI 會在卸除印表機圖形 DLL 之前呼叫DrvDisableDriver。
如果印表機硬體支援 GDI 繪圖函式不支援的繪圖作業,印表機圖形 DLL 可以提供 DrvDrawEscape 函式。
如果有必要支持無法透過 GDI 函式使用的繪圖或非繪製作業,印表機圖形 DLL 可以提供 DrvEscape 函式。 例如, Microsoft PostScript 印表機驅動程式 會使用逸出來支援 PostScript 插入點。 或者,應用程式可能需要取得傳真機的電話號碼。 DrvEscape 函式也用於指出DrvDrawEscape函式所支持的作業。