c++ - 打印的 CDC 在纸上显得很小

标签 c++ mfc printing

当我为我创建的报表控件打印 CDC 时,它看起来很小(在纸上小于 1 平方英寸)。如何让要打印的报告占据整个页面? 或者换句话说,我怎样才能使整个报告显示在一个打印页面中。

CPrintDialog 打印对话框(FALSE); printDialog.DoModal();

CDC dcPrint;
如果(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.m_rectDraw.SetRect(0,0, iHorzRes, iVertRes);
    dcPrint.StartDoc("报表打印");
    dcPrint.StartPage();
    如果(dcPrint.EndPage())
        dcPrint.EndDoc();
    别的
        dcPrint.AbortDoc();
}

dcPrint.DeleteDC();

m_CDC 是我用来缓冲和在屏幕上显示整个报告的内存 DC。

最佳答案

正如其他人所说,这是因为打印机的显示分辨率通常比显示器高很多。显示器通常为 96 到 120DPI:在 96DPI 这意味着 96 像素(点)乘 96 像素的图像在显示器上占据大约 1 平方英寸。但是,如果您只是拍摄该图像并在 600DPI 打印机上打印出来,则图像的大小约为 1/6"x 1/6"- 小得多。这是出版界的祸根 - 在显示器上看起来很好的图像在打印时通常看起来要么很小要么很糟糕。

正如所建议的那样,您可以使用 StretchBlt 而不是 BitBlt 来放大图像。根据您的显示器和打印机之间的差异,这可能看起来有点 block 状,或者非常 block 状。

一个更好的选择是重写绘制控件的代码,这样您就有了一个获取设备上下文(和一些坐标)并绘制到其中的方法。您的普通窗口绘制代码可以将内存 DC 传递给此例程,然后将结果通过 BitBlt 传递给窗口,并且您的绘制代码可以使用打印机 DC 和一些合适的坐标来调用此方法。

编写此例程时,您将不得不担心缩放问题:例如,您需要为给定的设备上下文创建字体,并使用与缩放无关的大小(即,以磅为单位指定字体大小,不是像素),而不是依赖于预先创建的字体。

关于c++ - 打印的 CDC 在纸上显得很小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/943279/

相关文章:

c++ - Ubuntu 触摸应用程序 : "Error opening shm"

c++ - 如何在 MFC 中将多个 CButton 标记为已单击

php - 将鼠标悬停在图像上,获取打印对话框?

python - 从单个列表python打印

java - 如何从sql数据库获取没有小时、分钟和秒的日期(只有yyyy-MM-dd)?

c++ - C/C++ 中的双向链表与多链表

c# - C# 的编码数据

c++ - 我构造子类对象的方式有什么问题?

c++ - 用于多个文件选择的 CFileDialog 问题

c# - 我可以让 Memcached 在 Windows (x64) 64 位环境中运行吗?