MFC 打印图片

BOOL PrintBitmap(LPCTSTR filename)
{
    CPrintDialog printDlg(FALSE);
    // printDlg.GetDefaults();

    if (printDlg.DoModal() == IDCANCEL)
        return FALSE;

    CDC dc;
    if (!dc.Attach(printDlg.GetPrinterDC()))
    {
        AfxMessageBox(_T("未发现发打印设备"));
        return FALSE;
    }

    dc.m_bPrinting = TRUE;
    DOCINFO di;
    // 初始化打印信息
    ::ZeroMemory(&di, sizeof(DOCINFO));
    di.cbSize = sizeof(DOCINFO);
    di.lpszDocName = filename;
    BOOL bPrintingOK = dc.StartDoc(&di); // 开始打印

    CPrintInfo Info;
    Info.SetMaxPage(1); // 只打印一页
    int maxw = dc.GetDeviceCaps(HORZRES);
    int maxh = dc.GetDeviceCaps(VERTRES);
    Info.m_rectDraw.SetRect(0, 0, maxw, maxh);
    for (UINT page = Info.GetMinPage(); page <=Info.GetMaxPage() && bPrintingOK; page++)
    {
        dc.StartPage(); // 开始打印新的一页
        Info.m_nCurPage = page;
        CBitmap bitmap;

        // 加载位图
        if (!bitmap.Attach(::LoadImage(::GetModuleHandle(NULL), filename, IMAGE_BITMAP, 0, 0,LR_LOADFROMFILE | LR_CREATEDIBSECTION | LR_DEFAULTSIZE)))
        {
            AfxMessageBox(_T("位图加载失败!"));
            return FALSE;
        }
        BITMAP bm;
        bitmap.GetBitmap(&bm);
        int w = bm.bmWidth;
        int h = bm.bmHeight;
        // 创建内存设备上下文
        CDC memDC;
        memDC.CreateCompatibleDC(&dc);
        CBitmap *pBmp = memDC.SelectObject(&bitmap);
        memDC.SetMapMode(dc.GetMapMode());
        dc.SetStretchBltMode(HALFTONE);
        // 拉伸打印
        dc.StretchBlt(0, 0, maxw, maxh, &memDC, 0, 0, w, h, SRCCOPY);
        // clean up
        memDC.SelectObject(pBmp);
        // end page
        bPrintingOK = (dc.EndPage() > 0);
    }
    if (bPrintingOK)
        dc.EndDoc(); // 打印完成
    else

        dc.AbortDoc(); // 终止打印

    return TRUE;
}

void CPrintDemoDlg::OnBnClickedOk()
{
    BOOL bRet = PrintBitmap(_T("1.bmp"));

    if (bRet)
        AfxMessageBox(_T("打印完成"));
}
本文为“老吴笔记”的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注