zoukankan      html  css  js  c++  java
  • 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;
      }

  • 相关阅读:
    Python 从入门到实践
    Python 斐波那契数列
    Python 纸牌游戏
    Python hangman小游戏
    BC #49 1001 Untitled
    BC#50 1003 The mook jong
    BC #50 1001 Distribution money
    vector
    stack
    queue
  • 原文地址:https://www.cnblogs.com/scud001/p/1725781.html
Copyright © 2011-2022 走看看