繁体   English   中英

以比屏幕分辨率更高的dpi打印表单

[英]Print a Form at higher dpi than screen resolution

问题:

我们需要有关如何使用WinForms自动缩放到不同DPI的功能的帮助,以允许我们以600dpi而不是屏幕DPI的格式打印表单。

对于您看到的就是您得到的打印,我们只是简单地将布局精美的窗口打印出来(关闭滚动条和按钮等)。 除了一件事,它的效果非常好:它的输出速度为96dpi或120dpi(无论屏幕分辨率是什么)……两者看上去都不真实且不专业(我们的客户在抱怨)。 而且,尽管它与屏幕上的内容一样可读,但是您希望打印的文档比在屏幕上更具可读性……您希望能够看到更多详细信息,能够阅读更小的文本,等等。

考虑的替代方案:

鉴于我们具有很好的自动缩放功能,因此我们的窗口在96dpi,120dpi,144 dpi等条件下看起来都不错,我们希望我们可以以600dpi的速度绘制窗口然后进行打印。

或者,我们看着在屏幕外以比正常大5-6倍的比例绘制窗口,以使我们拥有与600dpi相同的像素数,但像素为96或120 dpi…但是随后以300或600的比例将巨大的窗口绘制到打印页面dpi(无论打印机是什么)。

如果您可以告诉我们如何执行这些替代方法之一,或者可以给我们提供实现目标的其他方法,那么我们将不胜感激。

当前代码:

如果需要的话,我们的窗体由将其他较小的FlowLayoutPanels放置到列中的FlowLayoutPanel组成,那些较小的FlowLayoutPanels布局了TextBoxes,RichTextBoxes,第三方RichTextEditor,PictureBoxes和DataGridViews的单个列。 我们使用从PrintDocument派生的类来实现OnBeginPrint,OnPrintPage和OnEndPrint。 在OnPrintPage中,它操纵正常的屏幕外窗口(在实际屏幕的下方和右侧)以适合页面大小,然后要求主面板(顶部FlowLayoutPanel)使用DrawToBitmap,然后使用传递到PrintEventArgs中的Graphics对象到DrawImage该位图。 我们还使用Graphics.DrawString将页脚应用于每个页面。 主要代码:

                    using (Bitmap bm = new Bitmap(sz.Width, sz.Height))
                    {
                        Rectangle rect = new Rectangle(0, 0, sz.Width, sz.Height);
                        mp.DrawToBitmap(bm, rect);
                        e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; // so footer is anti-aliased
                        e.Graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;  // so when we scale up, we smooth out the jaggies somewhat
                        e.Graphics.DrawImage(bm, this.MarginBounds, rect, GraphicsUnit.Pixel);
                        if (this.Footer != null)
                            e.Graphics.DrawImage(this.Footer, this.FooterLocation);
                        if (!string.IsNullOrEmpty(pageNumber))
                        {
                            e.Graphics.DrawString(pageNumber, KBStyle.Normal.Font, Brushes.Black,
                                                  this.MarginBounds.X, this.FooterLocation.Y + FooterOffset);
                        }
                    }

如何使打印的页面达到600dpi? (甚至300 dpi都很棒!)

当我们打印时,从120dpi的机器打印时看起来比从96dpi的机器打印时看起来要好得多,因此为什么我们知道它是以屏幕分辨率打印的。 但是,这也让我们怀疑是否有某种简单的方法可以告诉它“此表格应以600 dpi的速度绘制”,然后上面的所有其余代码都可以正常工作。

注意:如果我们使用上面的代码抓取EMF(增强型图元文件)并将其打印到打印机,则该EMF的输出速度为600dpi。 不幸的是,我们没有找到可以在FlowLayoutPanel而不是DrawToBitmap上调用的DrawToEMF方法。 将位图更改为600dpi并没有帮助……DrawToBitmap方法似乎仍然以屏幕分辨率绘制位图。

谢谢!!

好的,我已经弄清楚了...而且效果很好!

我仍然不知道如何以300dpi的速度创建表单并使用自动缩放功能。

但…

我已经证明,如果您创建的窗口比96 dpi时所需的窗口大3.125倍,并且将字体放大至3.125倍,依此类推,那么即使您的屏幕是像素数,也需要300 dpi的速度为96dpi,则可以使用正常的Control.DrawToBitmap()功能将其转换为位图,然后可以使用GDI Graphics.DrawImage(thatGiantBitmap,giantSrcRect,pageSizeDestRect)到打印机Graphics对象,它将进行映射那些巨大的96dpi像素到页面大小的300dpi像素,可为您提供300dpi的打印效果。 完善。

对于我们支持缩放大小并允许用户任意缩放内容的任何窗口,然后轻松打印“您所见即所得”即可:

在您的PrintDocument的OnBeginPrint中,执行以下操作:

(1)(可选)将表单重复放置,以免与用户的查看内容混淆

(2)将您要打印的表格移出屏幕(在所有屏幕的下方和右侧)

(3)设置窗体,使其可以大于屏幕尺寸(默认情况下,WinForms不会大于屏幕尺寸)

(4)将300 dpi除以屏幕dpi以获得增长因子

(5)通过成长因素发展自己的形态

(6)按增长因子缩放其内容(如果它们没有根据窗体的大小自动缩放/自动缩放)

在你的PrintDocument的OnPrintPage,这样做:

(7)在要打印的窗体中的任何控件上,将DrawToBitmap()设置为该控件大小的位图

(8)在e.Graphics上执行DrawImage(thatGiantBitmap,giantSrcRect,pageSizeDestRect)

如果您的thatGiantBitmap中有那么多像素,则该DrawImage调用将以打印机的分辨率进行绘制。 在这种情况下,我计算了位图以给出300 dpi所需的像素数,因此即使打印机为600 dpi,我也将获得300 dpi的打印输出。 如果需要完整的600 dpi,只需在第4步的计算中使用600 dpi。

完全可以猜到,但是使用CSS呢? 我正在猜测您要缩放多少,并且不知道如何知道打印机的缩放比例。 使用打印介质查询使此功能适用于打印,但仅保留屏幕视图。

@media print {
  * {
    transform: scale(2000px,2000px);
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM