處理列印作業
重要
新式列印平臺是 Windows 與印表機通訊的慣用方法。 我們建議您使用Microsoft的 IPP 收件匣類別驅動程式,以及列印支援應用程式 (PSA),自定義 Windows 10 和 11 中的列印體驗,以進行印表機裝置開發。
如需詳細資訊,請參閱 列印支援應用程式設計指南。
列印作業會在建立時轉譯,或以EMF記錄形式寫入列印佇列檔案。 在EMF記錄的情況下,當EMF 列印處理器(localspl.dll)正在回放記錄時,就會進行渲染。 轉譯是由使用者模式 GDI 繪圖函式的一系列呼叫所組成,從 CreateDC 開始。 呼叫 CreateDC 是在一系列應用程式呼叫中的第一個,這會引發涉及圖形渲染引擎(GRE,也稱為核心模式 GDI)及其列印機圖形 DLL 的一連串動作。
下圖顯示呼叫 CreateDC 之後,核心模式 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 中呼叫下列函式:
針對每個實體頁面
DrvStartPage
DrvStartBanding
針對實體頁面上的每個帶狀傳遞
DrvQueryPerBandInfo
渲染作業
DrvNextBand - 傳送此頻帶的光柵數據,然後清除表面以便重複用於下個頻帶
DrvEndDoc
分組未使用
當未使用分段處理時,針對每個需要轉譯的文件,GDI 會在印表機圖形 DLL 中呼叫下列函式:
針對每個實體頁面
DrvStartPage
渲染作業
DrvSendPage - 傳送頁面的光柵圖像數據
DrvEndDoc
除了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 函式所支援的操作。