第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;
}