【 以下文字转载自 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绘图对象(多次),映射模式(一次,
第一次)
//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绘图对象(多次),映射模式(一次,
第一次)

浙公网安备 33010602011771号