可以参照《传统的Windows打印程序设计》
http://yadang418.blog.163.com/blog/static/26843656200966101621459/
一、重要的API函数
PrintDlg:
呼叫PrintDlg函数打开一个标准的打印对话框。这个函数还为使用者提供了一个在打印之前选择打印机和指定打印属性的机会。然后,它将打印机设备内容句柄交给应用程序。下面的代码是通过打印机选择画面获取打印机DC,并强制将打印方向改为横版打印。
PRINTDLG printInfo;
ZeroMemory(&printInfo,sizeof(printInfo));
printInfo.lStructSize = sizeof(printInfo);
printInfo.nFromPage = 0;
printInfo.nToPage = 1;
printInfo.hwndOwner = 0;
printInfo.hDevMode = 0;
printInfo.hDevNames = 0;
printInfo.Flags = PD_RETURNDC | PD_RETURNDEFAULT;
PrintDlg(&printInfo);
hdcPrn = printInfo.hDC; //得到打印DC!!!
lpDevMode = (LPDEVMODE)GlobalLock(printInfo.hDevMode);
if(lpDevMode)
{
lpDevMode->dmOrientation = DMORIENT_LANDSCAPE;//打印模式修改为横版打印
}
GlobalUnlock(printInfo.hDevMode);
ResetDC(printInfo.hDC, lpDevMode);
然而,某些应用程序不需要那个对话框,直接取得当前打印机设备内容,要做到这一点,需要呼叫CreateDC函数。
CreateDC:
hdc = CreateDC (NULL, szDeviceName, NULL, pInitializationData) ,
pInitializationData参数一般被设为NULL。szDeviceName参数指向一个字符串,以告诉Windows打印机设备的名称。在设定设备名称之前,您必须知道有哪些打印机可用。具体是搜索用户的WIN.INI文件或调用Windows的EnumPrinters() API函数。下面的代码是创建默认打印机的DC。
PRINTER_INFO_5 printerInfo5[3] ;
DWORD needed, returned;
EnumPrinters(PRINTER_ENUM_DEFAULT, NULL, 5, (LPBYTE) printerInfo5, sizeof(printerInfo5) , &needed, &returned) ;
HDC printDC = CreateDC(NULL, printerInfo5[0].pPrinterName, NULL, NULL) ;
StartDoc和EndDoc:
通知说一个打印开始了。打印一个文件的程序以StartDoc呼叫开始,以EndDoc呼叫结束。
StartPage和EndPage:
呼叫StartPage来开始一页,呼叫EndPage来结束该页。
举例:如果应用程序想在一页纸上画出一个椭圆,它首先呼叫StartDoc开始打印任务,然后再呼叫StartPage通知这是新的一页,接着呼叫Ellipse,正如同在屏幕上画一个椭圆一样。当绘制第一页的GDI呼叫结束时,应用程序呼叫EndPage。现在,真正的工作开始了。
二、打印步骤
1) 首先使用CreateDC或PrintDlg来取得指向打印机设备内容的句柄。
2) 程序呼叫StartDoc函数,通知说一个打印开始了。打印一个文件的程序以StartDoc呼叫开始。3) 一般windows打印程序跟屏幕绘图函数是公用的,因为打印机的像素点比屏幕像素点高很多,注意需要设定其映射关系。
SetMapMode(hdcPrn, MM_ANISOTROPIC);
SetWindowExtEx(hdcPrn, srcx, srcy, &size); //参数为屏幕像素个数
SetViewportExtEx(hdcPrn, prcx, prcy, &size); //参数为打印机像素个数
4) 呼叫StartPage来开始一页。
5)执行绘画函数。
6)呼叫EndPage来结束该页。
7)打印以EndDoc呼叫结束。
三、打印代码
srcx = GetDeviceCaps(window, HORZRES);
srcy = GetDeviceCaps(window, VERTRES);
prcx = GetDeviceCaps(hdcPrn, HORZRES);
prcy = prcx*(srcy/srcx);
print_count = totalPrintNum; //得到打印的张数
SetMapMode(hdcPrn, MM_ANISOTROPIC);
SetWindowExtEx(hdcPrn, srcx, srcy, &size); //参数为屏幕像素个数
SetViewportExtEx(hdcPrn, prcx, prcy, &size); //参数为打印机像素个数
if (StartDoc (hdcPrn, &di) > 0)
{
for (i=0;i<print_count;i++)
{
if (StartPage (hdcPrn) > 0)
{
DrawFunction(i); //自定义的绘图函数!!
if (EndPage (hdcPrn) > 0)
{
painted_y += srcy;
}
else
bSuccess = FALSE ;
}
}
}
else
bSuccess = FALSE;