MFC 打印

//计算打印页数

int iPrintPageCnt = SplitPage(); //根据自己的业务逻辑分割画布 计算打印页数 
print(iPrintPageCnt);

//打印函数

void print(int a_iMaxPage)
{
CPrintDialog dlg(FALSE, PD_ALLPAGES);// 如为 TRUE 则不能实现打印功能, 而是建立打印机
// 如果仅打印一份则可以用 dlg.GetDefaults();
dlg.GetDefaults();
HDC hdcPrinter = dlg.GetPrinterDC();
if (hdcPrinter == NULL) // Is a default printer set up?
{
AfxMessageBox(_T("Buy a printer!"));
}
else
{
CDC dcPrinter;
dcPrinter.Attach(hdcPrinter);
// 通知打印机驱动程序接受打印文档
DOCINFO docinfo;
memset(&docinfo, 0, sizeof(docinfo));
docinfo.cbSize = sizeof(docinfo);
docinfo.lpszDocName = _T("CDC::StartDoc() Code Fragment");
DEVMODE * dm = dlg.GetDevMode();
float rato = dm->dmPrintQuality / 25.4;// 每毫米多少像素 (A4:210mm*297mm)
float fPrintWid = 210 * rato; //打印机横向分辨率
float fRato = fPrintWid / m_iPageWid; //打印尺寸 / 画布尺寸
// If it fails, complain and exit gracefully.
if (dcPrinter.StartDoc(&docinfo) < 0)
{
AfxMessageBox(_T("Printer would not initalize"));
}
else
{
BOOL bPrintOK = TRUE;
for (UINT i = 0; i < a_iMaxPage; i++)
{
if (dcPrinter.StartPage() < 0)// 只起到判断作用,不加不会 // 影响正常打印
{
AfxMessageBox(_T("Could not start page"));
bPrintOK = FALSE;
dcPrinter.AbortDoc();
break;
}

DrawPage(&dcPrinter, i, fRato);  //向打印设备绘制内容

if (dcPrinter.EndPage() <= 0)// 告诉打印驱动换页,如果不 // 加则将所有页打在一张纸上
{
AfxMessageBox(_T("Could not end page"));
bPrintOK = FALSE;
dcPrinter.AbortDoc();
break;
}
}
if (bPrintOK == TRUE)
{
dcPrinter.EndDoc();// 结束打印
if (m_iLanguage == 1)
{
AfxMessageBox(_T("完成打印"));
}
else
{
AfxMessageBox(_T("EndDoc"));
}
}
}
dcPrinter.Detach();// 释放 DC
}
}

//向打印设备绘制内容

void CReportDlg::DrawPage(CDC * a_pDC, int a_iPage, float a_PrintRato)
{
CRect rDC(0, 0, m_iPageWid*a_PrintRato, m_iPageHei*a_PrintRato);
CCanvas canvas;
canvas.Create(a_pDC, m_iPageWid*a_PrintRato, m_iPrintPageCount*m_iPageHei*a_PrintRato);
canvas.SetFilledRGB(RGB(255, 255, 255));
canvas.GetDC()->SetBkMode(TRANSPARENT);
canvas.GetDC()->SetStretchBltMode(STRETCH_HALFTONE);
canvas.GetDC()->SelectStockObject(NULL_BRUSH);
//BaseInfo
DrawPrintBase(canvas.GetDC(),a_PrintRato);

canvas.OutToDC(a_pDC, rDC, 0, a_iPage*m_iPageHei*a_PrintRato);
canvas.Destroy();
}

 

原文地址:https://www.cnblogs.com/waterair/p/6739056.html