Printing MFC-将CBitmap打印到打印机CDC

Printing MFC-将CBitmap打印到打印机CDC,printing,mfc,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) {

我正在使用以下代码打印剪贴板中的内容(位图)。
在打印纸上,我看到用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();
}
keybd_事件(VK_快照,1,0,NULL);
HBITMAP句柄=NULL;
如果(::OpenClipboard(NULL))
{
handle=(HBITMAP)GetClipboardData(CF_位图);
if(句柄)
{
CBitmap*pBmp=CBitmap::FromHandle(句柄);
位图bm;
pBmp->GetBitmap(&bm);
int iBmpWidth=bm.bmWidth;
int iBmpHeight=bm.bmHeight;
CPrintDialog*pDlg=新建CPrintDialog(FALSE);
CString-csText;
CString-cTitle;
如果(pDlg->GetDefaults()==FALSE)
{
删除pDlg;
返回;
}
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();
如果(pDlg->DoModal()==IDOK)
{
HDC hdcpinter=pDlg->GetPrinterDC();
如果(hdcpinter!=NULL)
{
pDevMode=(LPDEVMODE)GlobalLock(pDlg->m_pd.hDevMode);
pDevMode->dmPaperSize=DMPAPER\U A4;
pDevMode->DMORIENTION=DMORIENT\U横向;
重置DCW(HDCPInter、pDevMode);
GlobalUnlock(pDlg->m_pd.hDevMode);
//创建CDC并将其连接到默认打印机
CDC-DC打印机;
dcPrinter.Attach(hdcPrinter);
//调用StartDoc()开始打印
DOCINFO DOCINFO;
memset(&docinfo,0,sizeof(docinfo));
docinfo.cbSize=sizeof(docinfo);
docinfo.lpszDocName=_T(“CDC::StartDoc()代码片段”);
//如果失败,投诉并优雅地退出
如果(dcPrinter.StartDoc(&docinfo)<0)
{
MessageBox(_T(“打印机无法初始化”);
}
其他的
{
//开始一页
如果(dcPrinter.StartPage()<0)
{
MessageBox(_T(“无法启动页面”);
dcPrinter.AbortDoc();
}
其他的
{
int PaperWidth=dcPrinter.GetDeviceCaps(HORZRES);
int PaperHeight=dcPrinter.GetDeviceCaps(VERTRES);
疾病预防控制中心;
memDC.CreateCompatibleDC(&dcPrinter);
CBitmap*pOldBit=memDC.SelectObject(pBmp);
dcPrinter.MoveTo(10001000);
dcPrinter.LineTo(纸张宽度-1000,纸张高度-1000);
dcPrinter.StretchBlt(100,
100, 
纸张宽度-100,
纸张高度-100,
&memDC,
0, 
0, 
iBmpWidth,
iBmpHeight,
复印件);
memDC.SelectObject(pOldBit);
memDC.DeleteDC();
dcPrinter.EndPage();
dcPrinter.EndDoc();
}
}
}
}
删除pDlg;
}
::清空电路板();
::CloseClipboard();
}

使用您的代码而不做任何更改对我来说很有效,我使用一台真正的打印机和CutePDF进行了测试,两者都打印了位图。当您创建memDC时,源DC可能会出现问题,它不支持正确的颜色空间或不支持光栅操作。请尝试以下代码:

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

使用您的代码而不做任何更改对我来说是可行的,我使用一台真正的打印机和CutePDF进行了测试,两者都打印了位图。当您创建memDC时,源DC可能会出现问题,它不支持正确的颜色空间或不支持光栅操作。请尝试以下代码:

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

我将在另一台计算机上试用你的代码Richard。我将在另一台计算机上试用你的代码Richard。我将在另一台计算机上试用。