2.1.1选择当前打印机

第2章      打印机基本控制技术

  打印编程之所以比较复杂,在于其需要处理的信息比较复杂.假如编程打印一张报表,我们不但要处理文本信息、
  完成表格绘制、版面编排等,而且可能还要进行相关图像处理。因此编写一个功能强大的打印程序,必须熟练
  掌握打印相关的控制技术。
2。1 控制打印机
 2。1。1选择当前打印机
  一个系统可以连接多个打印机,甚至可以有其他程序(传真软件)将自已伪装成打印机.不论连接的打印机有多少,
  始终有一个"当前打印机"或者"默认打印机".

  获取默认打印机设备环境的标准方法有:EnumPrinters()函数.该函数填充一个包含每个所连接打印机信息的数组
  结构.根据需要,还可以选择几种结构作为该函数的参数. 如结构PRINTER_INFO_x,x是一个数字,在Windows95,98上
  函数使用PRINTER_INFO_5结构,在Windows2000/xp上,函数使用PRINTER_INFO_4结构.

  获取当前打印机的另一种方法是使用打印对话框CPrintDialog.该类的GetDeviceName()函数用以获得当前选择的打印
  机的名称,GetDriverName()函数用以获得当前选择的打印机驱动程序.

  /*
  EnumPrinters
  Declare function EnumPrinters lib (ByVal flags As long,ByVar name As String,
  Byval Level As long,pPrinterEnum As Byte,ByVal cdBuf As long,pcbNeeded As Long,pcReturned As long ) As Long

  说明:枚举系统中安装的打印机.

  返回值:
  long,非零表示成功,零表示失败.可以通过GetLastError获取错误值.

  参数:
  flags: long,一个或多个下述标志.
   PRINTER_ENUM_LOCAL:检举本地打印机(包括Window95中的网络打印机)
   PRINTER_ENUM_NAME:枚举由name参数指定的打印机.如果name为NULL,则枚举出可用的打印机.
   PRINTER_ENUM_SHARE:枚举出共享打印机(必须同其他常数组合使用)
   PRINTER_ENUM_CONNECTIONS:枚举网络列表中的打印机.(仅适用于NT)
   PRINTER_ENUM_NETWORK:枚举通过网络连接的打印机.级别(level)必须为1,仅适用于NT
  name:String,vbNullString表示枚举同本机连接的打印机.否则由标志和级别决定.
  Level:Long,1,2,4或5(4仅适用于NT,5仅适用于Win95和NT4.0)指定欲枚举的结构的类型.
  如果是1,则name参数由标志设置决定.如果是2或5,那么name就代表要枚举的打印服务器的名字.
  或者为vcbNullString.如果是4,那么只有PRINTER_ENUM_LOCAL和PRINTER_ENUM_CONNECTIONS才有效.名字必须是vbNullString.

  pPrinterEnum:Byte,包含PRINTER_ENUM_x结构的缓冲区,其中x代表级别.
  cbBuf:Long,pPrinterEnum缓冲区中的字符数量.
  pcbNeeded:Long,指向一个Long型变量的指针,该变量用于保存请求的缓冲区长度.或者实际读入的字节数量.
  pcReturned:Long,载入缓冲区的结构数量(用于那些能返回多个结构的函数).

  说明:
  第4级和第5级将它们的结构建立在系统注册表的基础上.而且要比第2级快得多.

  使用EnumPrinter时,要包含以下头文件:#include <winspool.h>
  */
  注意:使用Printing and Print Spooler 函数必须包含"winspool.h"头文件。
  注意:使用Windows NT/2000/xp的读者使用EnumPrinters()函数时请使用PRINTER_INFO_4结构。

  void CPrintProj::OnEnumPrinters()
  {
   DWORD dwSize,dwPtiner;
   ::EnumPrinters(PRINTER_ENUM_LOCAL,NULL,5,NULL,0,&dwSize,&dwPrinter);
   BYTE *pBuffer = new BYTE[dwSize];
   ::EnumPrinters(PRINTER_ENUM_LOCAL,NULL,5,pBuffer,dwSize,&dwSize,&dwPrinter);

   if(dwPrinter != 0)
   {
    PRINTER_INFO_5 *pPrnInfo = (PRINTER_INFO_5*)pBuffer;
    for(UINT i = 0; i < dwPrinter; i++)
    {
     CString strprnInfo = pPrnInfo->pPrinterName;
     AfxMessageBox(strprnInfo);
     pPrnInfo++;
    }
   }
   delete[] pBuffer;
  }

转载于:https://www.cnblogs.com/scud001/archive/2010/05/01/1725781.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值