(转)pb控制打印机
https://blog.csdn.net/ribut9225/article/details/19408315
2014年02月18日 14:17:48?ribut9225?閱讀數 4020
在使用連續紙打印數據窗口的情況下,需要定制打印的頁長,以保證打印機走紙正確,不用人工干預,實現連續打印。在PB中須調用外部函數來自定義紙張長度,比較繁瑣。本文介紹一種直接對打印機的控制方法,簡單實現對頁長的設定。
?
---- 一、 預備知識
?
---- 計算機與打印機的通訊使用ASCII碼進行,其中標準ASCII碼包括可打印字符及非打印字符(控制碼),打印機使用控制碼來定制打印機。大多數打印機指令使用控制碼escape作為其指令序列的第一個序列碼。下面介紹本文用到的幾個指令碼序列:
?
設置換行量(行距)1/8 英寸
ASCII碼 ESC 0
十進制碼 27 48
?
設置以行為單位的頁長
ASCII碼 ESC C n
十進制碼 27 67 n
其中n 為每頁行數范圍(1-127)
?
---- 二、 PB中控制碼的傳送及定制頁長的實現
?
---- 在PB中通過函數Printsend(printjobnumber,string,{zerochar})來實現向打印機發送控制碼。各參數定義如下:
?
printjobnumber: 由printjob()函數返回的打印作業號;
string:????????控制字符串,使用ASCII碼;
zerochar:??????用來替代string中的數字0;
?
---- 由于字符串中,0終止字符串,如果string 中包含0,則需利用其他字符來表示0,參數zerochar即為此用途而設,當PB發送控制字符串給打印機時,把替代的字符zerochar轉化為0。
?
---- 下面是具體的完成定制頁長打印數據窗口的程序(定制頁長為2.75英寸):
?
long ll_job
dw_print.reset()
ll_job = printopen()
if ll_job = -1 then
messagebox(gs_title,"打印機未準備好")
return
end if
//定制行距1/8英寸
PrintSend(ll_job, CHAR(27)+CHAR(48))
//設定頁長22行
PrintSend(ll_job, CHAR(27)+CHAR(67)+CHAR(22))
printdatawindow(ll_job,dw_print)
printclose(ll_job)
?
通過ESC指令集來控制。
具體方法: ESC_D_M(M為數值)
?
long ll_job
dw_print.reset()
ll_job = printopen()
if ll_job = -1 then
messagebox(gs_title,"打印機未準備好")
return
end if
//定制行距1/8英寸
PrintSend(ll_job, CHAR(27)+CHAR(48))
//設定頁長22行
PrintSend(ll_job,CHAR(27)+CHAR(67)+CHAR(dw_print.rowcount()))
printdatawindow(ll_job,dw_print)
printclose(ll_job)
可控制打印走紙的長度,如你打印時用dw_print.print()你windows中默認打印機的紙張是A4
這樣打印時如果dw中有一行也是把A4這張紙走完,如果你用上面的這可以控制如dw中有10行這樣走到第10行時,打印作業就停止了!,你可以把上面的程序寫到你的程序中就應該可以解決,不過此程序只適用于針式打印機
如有問題可以發郵件pjj-33@163.com
?
//連續打印
job = PrintOpen()
PrintSend(job,CharA(27) + CharA(67) + CharA(1)) //以行為單位設定頁長
PrintSend(job,CharA(27) + CharA(85) + CharA(48)) //解除粗體字體
PrintSend(job,CharA(28) + CharA(120) + CharA(1)) //選擇英文字體打印品質
PrintDataWindow(job,dw)
PrintClose(job)
--------------------打印機退紙----------------------------------------------------?
打印時能使紙回退,打印完之后能能讓紙前進一些,適合于打票據的單位(注意使用printdatawindow函數,Datawindow中字體設置均無效) ??
? ??
? long ? job,temp ??
? job=printopen() ??
? printsend(job,"~h1B~h6A~254") ??
? printsend(job,"~h1B~h6A~100") ??
? printsend(job,"~h1c~h78~h01") ??
? printsend(job,"~h1B~h43~h01") ??
? print(job,"") ??
? temp=printdatawindow(job,dw_print) ? ? /*dw_print是要打印的數據窗口*/ ??
? printclose(job) ??
? Job ? = ? PrintOpen() ??
? printsend(job,"~h1B~h43~h13") ??
? ? ??
? printclose(job) ??
? ??
--------------------------------------------------------------------------
API之打印函數
AbortDoc 取消一份文檔的打印
AbortPrinter 刪除與一臺打印機關聯在一起的緩沖文件
AddForm 為打印機的表單列表添加一個新表單
AddJob 用于獲取一個有效的路徑名,以便用它為作業創建一個后臺打印文件。它也會為作業分配一個作業編號
AddMonitor 為系統添加一個打印機監視器
AddPort 啟動"添加端口"對話框,允許用戶在系統可用端口列表中加入一個新端口
AddPrinter 在系統中添加一臺新打印機
AddPrinterConnection 連接指定的打印機
AddPrinterDriver 為指定的系統添加一個打印驅動程序
AddPrintProcessor 為指定的系統添加一個打印處理器
AddPrintProvidor 為系統添加一個打印供應商
AdvancedDocumentProperties 啟動打印機文檔設置對話框
ClosePrinter 關閉一個打開的打印機對象
ConfigurePort 針對指定的端口,啟動一個端口配置對話框
ConnectToPrinterDlg 啟動連接打印機對話框,用它同訪問網絡的打印機連接
DeleteForm 從打印機可用表單列表中刪除一個表單
DeleteMonitor 刪除指定的打印監視器
DeletePort 啟動"刪除端口"對話框,允許用戶從當前系統刪除一個端口
DeletePrinter 將指定的打印機標志為從系統中刪除
DeletePrinterConnection 刪除與指定打印機的連接
DeletePrinterDriver 從系統刪除一個打印機驅動程序
DeletePrintProcessor 從指定系統刪除一個打印處理器
DeletePrintProvidor 從系統中刪除一個打印供應商
DeviceCapabilities 利用這個函數可獲得與一個設備的能力有關的信息
DocumentProperties 打印機配置控制函數
EndDocAPI 結束一個成功的打印作業
EndDocPrinter 在后臺打印程序的級別指定一個文檔的結束
EndPage 用這個函數完成一個頁面的打印,并準備設備場景,以便打印下一個頁
EndPagePrinter 指定一個頁在打印作業中的結尾
EnumForms 枚舉一臺打印機可用的表單
EnumJobs 枚舉打印隊列中的作業
EnumMonitors 枚舉可用的打印監視器
EnumPorts 枚舉一個系統可用的端口
EnumPrinterDrivers 枚舉指定系統中已安裝的打印機驅動程序
EnumPrinters 枚舉系統中安裝的打印機
EnumPrintProcessorDatatypes 枚舉由一個打印處理器支持的數據類型
EnumPrintProcessors 枚舉系統中可用的打印處理器
Escape 設備控制函數
FindClosePrinterChangeNotification 關閉用FindFirstPrinterChangeNotification函數獲取的一個打印機通告對象
FindFirstPrinterChangeNotification 創建一個新的改變通告對象,以便我們注意打印機狀態的各種變化
FindNextPrinterChangeNotification 用這個函數判斷觸發一次打印機改變通告信號的原因
FreePrinterNotifyInfo 釋放由FindNextPrinterChangeNotification函數分配的一個緩沖區
GetForm 取得與指定表單有關的信息
GetJob 獲取與指定作業有關的信息
GetPrinter 取得與指定打印機有關的信息
GetPrinterData 為打印機設置注冊表配置信息
GetPrinterDriver 針對指定的打印機,獲取與打印機驅動程序有關的信息
GetPrinterDriverDirectory 判斷指定系統中包含了打印機驅動程序的目錄是什么
GetPrintProcessorDirectory 判斷指定系統中包含了打印機處理器驅動程序及文件的目錄
OpenPrinter 打開指定的打印機,并獲取打印機的句柄
PrinterMessageBox 在擁有指定打印作業的系統上顯示一個打印機出錯消息框
PrinterProperties 啟動打印機屬性對話框,以便對打印機進行配置
ReadPrinter 從打印機讀入數據
ResetDC 重設一個設備場景
ResetPrinter 改變指定打印機的默認數據類型及文檔設置
ScheduleJob 提交一個要打印的作業
SetAbortProc 為Windows指定取消函數的地址
SetForm 為指定的表單設置信息
SetJob 對一個打印作業的狀態進行控制
SetPrinter 對一臺打印機的狀態進行控制
SetPrinterData 設置打印機的注冊表配置信息
StartDoc 開始一個打印作業
StartDocPrinter 在后臺打印的級別啟動一個新文檔
StartPage 打印一個新頁前要先調用這個函數
StartPagePrinter 在打印作業中指定一個新頁的開始
WritePrinter 將發送目錄中的數據寫入打印機
--------------------------------
PB中控制碼的傳送及定制頁長的實現
----?在PB中通過函數Printsend(printjobnumber,string,{zerochar})來實現向打印機發送控制碼。各參數定義如下:
printjobnumber: 由printjob()函數返回的打印作業號; string: 控制字符串,使用ASCII碼; zerochar: 用來替代string中的數字0;----?由于字符串中,0終止字符串,如果string 中包含0,則需利用其他字符來表示0,參數zerochar即為此用途而設,當PB發送控制字符串給打印機時,把替代的字符zerochar轉化為0。
----?下面是具體的完成定制頁長打印數據窗口的程序(定制頁長為2.75英寸):
long ll_job dw_print.reset() ll_job = printopen() if ll_job = -1 thenmessagebox(gs_title,"打印機未準備好")return end if //定制行距1/8英寸 PrintSend(ll_job, CHAR(27)+CHAR(48)) //設定頁長22行 PrintSend(ll_job, CHAR(27)+CHAR(67)+CHAR(22)) printdatawindow(ll_job,dw_print) printclose(ll_job)?
總結
以上是生活随笔為你收集整理的(转)pb控制打印机的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 俄罗斯独立自主的计算机技术和计算机网络
- 下一篇: 嵌入式大神:教你如何从零开始学习路线解析