(转)pb控制打印机

  1. https://blog.csdn.net/ribut9225/article/details/19408315

  2. 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

     

  3. //连续打印

  4. job = PrintOpen()

  5. PrintSend(job,CharA(27) + CharA(67) + CharA(1)) //以行为单位设定页长

  6. PrintSend(job,CharA(27) + CharA(85) + CharA(48)) //解除粗体字体

  7. PrintSend(job,CharA(28) + CharA(120) + CharA(1)) //选择英文字体打印品质

  8. PrintDataWindow(job,dw)

  9. PrintClose(job)

  10. --*********************************************************************************
  11. --------------------打印机退纸---------------------------------------------------- 

    打印时能使纸回退,打印完之后能能让纸前进一些,适合于打票据的单位(注意使用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 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)
    

     
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值