缩放像素值以进行打印

时间:2010-06-23 10:42:49

标签: delphi printing

我试图在一些与打印相关的旧代码中找到一些意义。

将表单绘制到打印机时,每个大小和位置属性都会乘以比例因子。该因子通过以下代码计算:

    { Printer device-specific information }
    FXScale := (GetDeviceCaps(Printer.Handle, LOGPIXELSX)/96) -
               ((2-(GetDeviceCaps(Printer.Handle, HORZRES)*2) /
               GetDeviceCaps(Printer.Handle, PHYSICALWIDTH)));
    FYScale := (GetDeviceCaps(Printer.Handle, LOGPIXELSY)/96) -
               ((2-(GetDeviceCaps(Printer.Handle, VERTRES)*2) /
               GetDeviceCaps(Printer.Handle, PHYSICALHEIGHT)));

有谁能解释这里发生了什么?我猜屏幕分辨率和打印机分辨率之间存在一些映射,但其余的呢?为什么选择2?

3 个答案:

答案 0 :(得分:3)

好的,不确定我是否已经得到了完整的答案,但也许这有助于刺激其他人朝着正确的方向前进:

FXScale = (LogPixelsX / 96) - (2 - ((2 * HorzRes) / PhysicalWidth))
        = (LogPixelsX / 96) - (2 - (2 * (HorzRes / PhysicalWidth)))
        = (LogPixelsX / 96) - (2 * (1 - (HorzRes / PhysicalWidth)))

由于PhysicalWidth保证大于或等于HorzRes(请参阅MS documentation),1 - (HorzRes / PhysicalWidth) = ((PhysicalWidth - HorzRes) / PhysicalWidth)。然后我们有:

FXScale = (LogPixlesX / 96) - (2 * ((PhysicalWidth - HorzRes) / PhysicalWidth)
  • (LogPixelsX / 96) =打印机DPI与屏幕DPI的比率
  • ((PhysicalWidth - HorzRes) / PhysicalWidth) =不可打印宽度与纸张总宽度的比率

因此,看起来计算打印机DPI与屏幕DPI的比率,然后减去不可打印宽度与纸张总宽度之比的两倍。也许2是要远离打印机物理极限的边缘?

答案 1 :(得分:1)

这里只是一个提示......不要硬编码96.较新的显示器可以在更高的分辨率下运行。因此,如果您希望保持使打印报告与屏幕上的大小“大致相同”的功能,则应动态确定。

答案 2 :(得分:0)

纸张两边可能有1英寸的边距吗?