印刷的CDC在纸上看起来很小

时间:2009-06-03 06:05:22

标签: c++ mfc printing

当我为我创建的报告控件打印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。

3 个答案:

答案 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()。