当我为我创建的报告控件打印CDC时,它看起来很小(纸上不到1平方英寸)。如何才能打印报告以占据整个页面? 或者换句话说,如何使整个报告显示在一个打印页面中。
CPrintDialog printDialog(FALSE);
printDialog.DoModal();
CDC dcPrint;
if(dcPrint.Attach(printDialog.GetPrinterDC()))
{
int iHorzRes = dcPrint.GetDeviceCaps(HORZRES);
int iVertRes = dcPrint.GetDeviceCaps(VERTRES);
int iHorzResCDC = m_CDC.GetDeviceCaps(HORZRES);
int iVertResCDC = m_CDC.GetDeviceCaps(VERTRES);
dcPrint.m_bPrinting = TRUE;
dcPrint.BitBlt(0,0, iHorzRes, iVertRes, &m_CDC, iHorzResCDC, iVertResCDC, SRCCOPY);
CFont* pOldFont = dcPrint.SelectObject(&m_HeaderFont);
dcPrint.TextOut(0,0,"HelloWorld") ;
dcPrint.SelectObject(pOldFont);
CPrintInfo printInfo;
printInfo.m_rectDraw.SetRect(0,0, iHorzRes, iVertRes);
dcPrint.StartDoc("Report Print");
dcPrint.StartPage();
if(dcPrint.EndPage())
dcPrint.EndDoc();
else
dcPrint.AbortDoc();
}
dcPrint.DeleteDC();
CDC dcPrint;
if(dcPrint.Attach(printDialog.GetPrinterDC()))
{
int iHorzRes = dcPrint.GetDeviceCaps(HORZRES);
int iVertRes = dcPrint.GetDeviceCaps(VERTRES);
int iHorzResCDC = m_CDC.GetDeviceCaps(HORZRES);
int iVertResCDC = m_CDC.GetDeviceCaps(VERTRES);
dcPrint.m_bPrinting = TRUE;
dcPrint.BitBlt(0,0, iHorzRes, iVertRes, &m_CDC, iHorzResCDC, iVertResCDC, SRCCOPY);
CFont* pOldFont = dcPrint.SelectObject(&m_HeaderFont);
dcPrint.TextOut(0,0,"HelloWorld") ;
dcPrint.SelectObject(pOldFont);
CPrintInfo printInfo;
printInfo.m_rectDraw.SetRect(0,0, iHorzRes, iVertRes);
dcPrint.StartDoc("Report Print");
dcPrint.StartPage();
if(dcPrint.EndPage())
dcPrint.EndDoc();
else
dcPrint.AbortDoc();
}
dcPrint.DeleteDC();
m_CDC是我用来缓冲并在屏幕上显示整个报告的内存DC。
答案 0 :(得分:2)
正如其他人所说,这是因为,一般来说,打印机的显示分辨率远高于显示器。显示器通常为96到120DPI:在96DPI时,这意味着96像素(点)乘96像素的图像在显示器上占据大约1平方英寸。但是,如果您只是拍摄该图像并在600DPI打印机上打印出来,图像的大小将约为1/6“乘1/6” - 要小得多。这是出版界的祸根 - 在显示器上看起来很好的图像在打印时看起来很小或很糟糕。
您可以按照建议使用StretchBlt而不是BitBlt来放大图像。根据您的显示器和打印机之间的差异,这将看起来有点块状,或完全可怕的块状。
更好的选择是重写执行控件绘制的代码,以便您获得一个采用设备上下文(和一些坐标)的方法并将其绘制到其中。您的普通窗口绘制代码可以将内存DC传递给此例程,然后将结果BitBlt到窗口,您的绘图代码可以使用打印机DC和一些合适的坐标来调用此方法。
编写此例程时,您将不得不担心缩放:例如,您需要为给定的设备上下文创建字体,并使用scaling-indepdendant大小(即,以磅为单位指定字体大小,不是像素),而不是依赖于预先创建的字体。
答案 1 :(得分:0)
我认为您没有将报告缩放到打印机的分辨率。典型的屏幕分辨率为72 DPI(有时为96 DPI)。打印机分辨率可以是300DPI,600DPI或更高。
您应该将报告重新绘制到打印机DC,并将所有坐标和大小缩放到打印机的分辨率。
答案 2 :(得分:0)
您的打印机每英寸点数比屏幕多得多。您需要扩展内容以更好地适应打印页面。
尝试使用StretchBlt()而不是BitBlt()。