/中文/
/中文/
/中文/
/中文/
/中文/
/中文/
/中文/
/中文/
/中文/
/中文/
文檔照片打印處理是一款操作上非常簡便,各功能在界麵上顯示的非常清楚,為用戶提供照片打印的輔助工具,在打印前可對圖像進行亮度、對比度、色調等調整,用戶能夠預覽到其效果,滿意之後就能開始打印了。
文檔照片打印處理支持將文檔打印成圖片的工具,ImagePrinter可以將文檔“打印(虛擬打印)”成BMP、PNG、JPG、PDF等格式的文件,安裝後會成為係統的默認打印機。
1、圖片拖入到窗口
2、調整亮度和對比度
3、可以直接打印或保存修改的圖片
1、驅動層(Driver)一種。好像是修改Render plug-in什麼的。沒做過。
2、打印假脫機(splooer)層兩種。
(1)自定義打印處理器(PrintProcessor),一般是修改DDK中genprint的例子。將自定義的代碼加入到PrintDocumentOnPrintProcessor中。
(2)在監視(Monitor)層。
打印假脫機(splooer)層兩種的兩種實現方法驅動層一般都用微軟統一驅動程序(UniDrv)。
通過打印測試頁可以了解安裝的打印驅動的各個方麵:驅動程序、端口等。也可以通過打印機的屬性查看。
ImagePrinter是用的自定義端口的形式實現虛擬打印。
ImagePrinter是在Port監視器端的虛擬打印機。
(1)在係統開機時,順序調用以下函數:DllMain--->InitializePrintMonitor--->iEnumPorts(2次,後一次參數都是NULL)--->iOpenPort;
(2)在打印文檔時,順序調用以下函數:iStartDocPort--->iWritePort(很多次)--->iEndDocPort。
以下是DDK的翻譯(根據對代碼的理解,有刪減):
(1)初始化打印監視器
當spooler調用LoadLibrary來加載的打印監視器DLL,係統立即調用DLL的DllEntryPoint函數。可以在此時LisableThreadLibraryCalls,這樣創建和刪除線程時,不必非得這個通知DLL。
每一個DLL都導出一個初始化函數,可以供spooler在調用LoadLibrary後調用。Language monitor DLL和port monitor server DLL導出InitializePrintMonitor2函數。port monitor UI DLL的導出InitializePrintMonitorUI函數。(總共有3中Monitor)。
這兩個初始化函數的作用是返回其他函數(EnumPorts,OpenPort,StartDocPort等所有以下用的函數)的指針,這樣spooler就可以調用它們了。初始化函數也可以執行load time的初始化操作。
InitializePrintMonitor2函數返回一個監視器實例句柄。monitor應分配本地內存來存儲自定義的一些信息,並以此句柄為標識來分配內存。
當spooler第一次啟動時(一般是開機時,如果你開機啟動了spooler服務的話),它會載入所有已安裝的monitor DLL的。所有Monitor的初始化函數調用後,打印後台處理程序調用每個port monitor的EnumPorts函數,其中列舉了monitor支持的端口。monitor支持一個端口,如果端口已被添加到monitor的數據庫。然後打開每個支持的端口。
(2)打開和關閉端口
spooler 通過調用language monitor的OpenPortEx函數打開端口;相對應的Port monitor調用OpenPort函數,language monitor隻返回從Port monitor的OpenPort獲得的句柄。如果沒有language monitor,就直接調Port monitor的OpenPort函數。打開一個端口後不關閉的話,不能再打開。
端口一經打開,打印後台處理程序就可以調用其他函數來打印作業了。這些函數使用OpenPort返回的句柄作為輸入。什麼時候端口關閉呢:係統關機,沒打印任務....
(3)打印打印作業
每個打印作業以StartDocPort開始,以EndDocPort結束。當print processor 調用的spooler的StartDocPrinter EndDocPrinter的函數時,這兩個函數被調用。在這兩個函數調用中間,不定量的WritePort, ReadPort, and GetPrinterDataFromPort函數被調用。
這些函數都需要用到OpenPortEx(或OpenPort)返回的句柄( port handle)作為輸入參數。
當spooler調用language monitor 的WritePort函數,以將數據流發送到端口時,這些函數一般隻增加一些特定的語言信息到接收到的數據流上,如PJL命令然後將它傳遞給相關的port monitor的WritePort功能。
ReadPort函數是用於獲取雙向打印機硬件的狀態信息。Language monitor 通過調用SetPort將信息發送到spooler,獲得狀態信息。spooler不能調用ReadPort的函數。
如果打印硬件是雙向的,language monitor和port monitor 都應該實現GetPrinterDataFromPort函數。language monitor的GetPrinterDataFromPort函數以注冊表值的名稱為輸入,獲得該名稱的值(通常由調用相關的端口監視器的WritePort和ReadPort功能),並返回值給調用者。port monitor 的GetPrinterDataFromPort函數應該接受一個I / O控製代碼作為輸入,調用DeviceIoControl返回控製代碼給port driver,並返回結果。