• 博客园logo
  • 会员
  • 周边
  • 众包
  • 新闻
  • 博问
  • 闪存
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
云飞扬
大风起兮云飞扬
博客园    首页    新随笔    联系   管理    订阅  订阅
2.1.1选择当前打印机
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;
  }

posted on 2010-05-01 21:41  scud001  阅读(741)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3