MFC - 将CBitmap打印到打印机CDC

时间:2016-03-10 11:49:57

标签: printing mfc

我使用以下代码打印剪贴板内的内容(位图) 在打印的纸张上,我看到用MoveTo / LineTo绘制的黑线,但是没有绘制位图 在CView中使用相同的绘图代码非常合适。

keybd_event(VK_SNAPSHOT, 1, 0, NULL);
HBITMAP handle = NULL;

if (::OpenClipboard(NULL))
{
    handle = (HBITMAP)GetClipboardData(CF_BITMAP);

    if (handle)
    {
        CBitmap* pBmp = CBitmap::FromHandle(handle);
        BITMAP bm;
        pBmp->GetBitmap(&bm);
        int iBmpWidth = bm.bmWidth;
        int iBmpHeight = bm.bmHeight;

        CPrintDialog* pDlg = new CPrintDialog(FALSE);
        CString csText;
        CString cTitle;

        if (pDlg->GetDefaults() == FALSE)
        {
            delete pDlg;
            return;
        }

        pDlg->m_pd.Flags &= ~PD_RETURNDEFAULT;
        LPDEVMODE pDevMode = pDlg->GetDevMode();
        ::GlobalUnlock(pDlg->m_pd.hDevMode);

        DOCINFO di;
        di.cbSize = sizeof(DOCINFO);
        pDlg->m_pd.hwndOwner = this->GetSafeHwnd();

        if (pDlg->DoModal() == IDOK)
        {
            HDC hdcPrinter = pDlg->GetPrinterDC();

            if (hdcPrinter != NULL)
            {
                pDevMode = (LPDEVMODE)GlobalLock(pDlg->m_pd.hDevMode);
                pDevMode->dmPaperSize = DMPAPER_A4;             
                pDevMode->dmOrientation = DMORIENT_LANDSCAPE;   
                ResetDCW(hdcPrinter, pDevMode);                 
                GlobalUnlock(pDlg->m_pd.hDevMode);

                // create a CDC and attach it to the default printer
                CDC dcPrinter;
                dcPrinter.Attach(hdcPrinter);

                // call StartDoc() to begin printing
                DOCINFO docinfo;
                memset(&docinfo, 0, sizeof(docinfo));
                docinfo.cbSize = sizeof(docinfo);
                docinfo.lpszDocName = _T("CDC::StartDoc() Code Fragment");

                // if it fails, complain and exit gracefully
                if (dcPrinter.StartDoc(&docinfo) < 0)
                {
                    MessageBox(_T("Printer wouldn't initalize"));
                }
                else
                {
                    // start a page
                    if (dcPrinter.StartPage() < 0)
                    {
                        MessageBox(_T("Could not start page"));
                        dcPrinter.AbortDoc();
                    }
                    else
                    {

                        int PaperWidth = dcPrinter.GetDeviceCaps(HORZRES);
                        int PaperHeight = dcPrinter.GetDeviceCaps(VERTRES);             

                        CDC memDC;
                        memDC.CreateCompatibleDC(&dcPrinter);
                        CBitmap* pOldBit = memDC.SelectObject(pBmp);

                        dcPrinter.MoveTo(1000, 1000);
                        dcPrinter.LineTo(PaperWidth - 1000, PaperHeight - 1000);

                        dcPrinter.StretchBlt(100, 
                                                100, 
                                                PaperWidth - 100, 
                                                PaperHeight - 100, 
                                                &memDC, 
                                                0, 
                                                0, 
                                                iBmpWidth, 
                                                iBmpHeight, 
                                                SRCCOPY);

                        memDC.SelectObject(pOldBit);
                        memDC.DeleteDC();

                        dcPrinter.EndPage();
                        dcPrinter.EndDoc();
                    }
                }
            }
        }

        delete pDlg;
    }

    ::EmptyClipboard();
    ::CloseClipboard();
}

1 个答案:

答案 0 :(得分:0)

使用您的代码而不做任何更改对我有用,我使用真正的打印机和CutePDF测试,都打印了位图。创建memDC时,源DC可能存在问题,要么它不支持正确的色彩空间,要么不支持光栅操作。请尝试使用以下代码:

CDC* pDC = GetDesktopWindow()->GetDC();
memDC.CreateCompatibleDC(pDC);
GetDesktopWindow()->ReleaseDC(pDC);