网语飘飘.Net/Delphi攻坚战

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::
【 以下文字转载自 post 讨论区 】【 原文由 username.bbs@bbs.hhu.edu.cn, 所发表 】
//VC中打印机的使用
//使用EnumPrinter();来取得系统中所有的能用的打印机
  DWORD            dwFlags = PRINTER_ENUM_FAVORITE | PRINTER_ENUM_LOCAL;
  LPPRINTER_INFO_2 pPrinters;
  DWORD            cbPrinters;
  DWORD            cReturned, i;
  ::EnumPrinters (dwFlags, NULL, 2, NULL, 0, &cbPrinters,
                &cReturned);
  pPrinters = (LPPRINTER_INFO_2) ::LocalAlloc (LPTR, cbPrinters + 4);
  ::EnumPrinters (dwFlags, NULL, 2, (LPBYTE) pPrinters,
                     cbPrinters, &cbPrinters, &cReturned);
//-----------------------------------------------------------------
/*
BOOL EnumPrinters(
  DWORD Flags,         // types of printer objects to enumerate
  LPTSTR Name,         // name of printer object
  DWORD Level,         // specifies type of printer info structure
  LPBYTE pPrinterEnum, // pointer to buffer to receive printer info
                       // structures
  DWORD cbBuf,         // size, in bytes, of the buffer
  LPDWORD pcbNeeded,   // pointer to variable with no. of bytes
                       // copied (or required)
  LPDWORD pcReturned   // pointer to variable with no. of printer
                       // info. structures copied
);
*/
//-----------------------------------------------------------------
//cReturned 的值为安装的打印机的个数
//可以使用for(,,)来取出所有的打印机显示出来
char printername[20];
char drivername[20];
char portname[20];
strcpy(printername,(pPrinters+i) ->pPrinterName);
strcpy(drivername,(pPrinters+i) ->pDriverName);
strcpy(portname,(pPrinters+i) ->pPortName);
//-----------------------------------------------------------------
//创建打印机的设备描述表
/*
The CreateDC function creates a device context (DC) for a device by using th
e specified name.
HDC CreateDC(
  LPCTSTR lpszDriver,  // pointer to string specifying driver name
  LPCTSTR lpszDevice,  // pointer to string specifying device name
  LPCTSTR lpszOutput,  // do not use; set to NULL
  CONST DEVMODE *lpInitData
                       // pointer to optional printer data
);
*/
//-----------------------------------------------------------------
DEVMODE dm;
//在dm变量中设置各种参数,如:纸张大小,方向,打印的质量
PRINTER_DEFAULTS de;
HANDLE hPrinter;
::OpenPrinter(printername,&hPrinter,&de);
DEVMODE *dv;
dv=de.pDevMode ;
//ghdc=::CreateDC(printername,drivername,dv,NULL);
  ghdc=::CreateDC(printername,drivername,NULL,NULL);
//按照自己设置的纸张的大小来进行计算和打印
.............
//以上是直接使用函数来得到DC,以下使用对话框来取得打印机的HDC
    PRINTDLG  pd;
    memset(&pd,0,sizeof(pd));
    pd.hwndOwner=this->m_hWnd;
    pd.Flags =PD_ALLPAGES|PD_RETURNDC;
    pd.lStructSize =sizeof(pd);
    PrintDlg(&pd);
//可以在的对话框中设置各种属性
  hPrDc=pd.hDC;
  gbAbort = FALSE;
//显示打印的取消对话框
  ghwndAbort = CreateDialog (ghInst, (LPCTSTR) "Abort", ghwndMain,
                             (DLGPROC) AbortDlgProc);
  EnableWindow (ghwndMain, FALSE);
  SetAbortProc (hPrDc, AbortProc);
  //
  // create & select pen/brush
  //
  hpen = CreatePen (giPenStyle, giPenWidth, gdwPenColor);
  SelectObject (hPrDc, hpen);
  hbr  = CreateHatchBrush (giBrushStyle, gdwBrushColor);
  SelectObject (hPrDc, hbr);
  SetTextColor (hPrDc, gdwTextColor);
//设置映射模式
  SetMapMode (hPrDc, giMapMode);
//取得纸张的大小
  rect.top       =
  rect.left      = 0;
  rect.right     = GetDeviceCaps (ghdc, HORZRES);
  rect.bottom    = GetDeviceCaps (ghdc, VERTRES);
  di.cbSize      = sizeof(DOCINFO);
  di.lpszDocName ="docname";
  di.lpszOutput  = NULL;
  ::StartDoc  (hPrDc, &di);//系统准备一个打印文档的开始
  ::StartPage (hPrDc);
//StartPage call does reset the device context attributes to default values.
At that time, you //must re-select objects and set up the mapping mode agai
n before printing the next page.
//调用StartPage以后系统清除页面的内容,
//可以改变GDI对象
//在hPrDc中写入内容
........
//系统进行GDI操作的时候,将每一个的GDI的操作记录下来,生成metafile文件
  ::EndPage   (hPrDc);//DRV解读metafile文件,生成POSTSCRIPT,传给GDI,同时换

//::EndPage   (hPrDc);并不改变DEVICE CONTEXT 的属性,
//但接下来的  ::StartPage (hPrDc);将DEVICE CONTEXT 的所有的属性改变成
//GDI把他们存成~SPL文件,
//进行下一页的页面的设置
.............//多页
  ::StartPage (hPrDc);
//第二页
  ::EndPage   (hPrDc);
//可以调用::ResetDc(hPrDc,Devmode);来改变下一页的打印页数,打印质量,纸张的大
小,打印的方向
  ::StartPage (hPrDc);
//第三页
  ::EndPage   (hPrDc);
//可以调用::ResetDc();来改变下一页的打印页数,打印质量,纸张的大小,打印的方

  ::StartPage (hPrDc);
//第N页
  ::EndPage   (hPrDc);
//可以调用::ResetDc();来改变下一页的打印页数,打印质量,纸张的大小,打印的方

  ::EndDoc    (hPrDc);//系统结束一个打印文档,GDI发消息给PrinterManager,Pri
nterManager
//将~SPL文件中的数据提交给打印机打印
  ::DeleteDC  (hPrDc);
//每一页中可以对Device Context 设置的属性:GDI绘图对象(多次),映射模式(一次,
第一次)
posted on 2006-06-06 16:25  网语飘飘  阅读(888)  评论(0)    收藏  举报