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。我将在另一台计算机上试用。