• 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();
    }

     

  • 相关阅读:
    SpringBoot------异步任务的使用
    SpringBoot------定时任务
    MySQL中文编码设置为utf-8
    MySQL 中文未正常显示
    使用postman测试接口时需要先登录怎么办
    python 查询数据库返回的数据类型
    数据库和数据仓库的关系
    distinct 用法
    Hbase学习
    顺序访问数据和随机访问数据
  • 原文地址:https://www.cnblogs.com/waterair/p/6739056.html
Copyright © 2020-2023  润新知