如何调整表单或 FlowLayoutPanel 的大小以打印大于屏幕尺寸?

Posted

技术标签:

【中文标题】如何调整表单或 FlowLayoutPanel 的大小以打印大于屏幕尺寸?【英文标题】:How can I size a Form or a FlowLayoutPanel for printing larger than the Screen size? 【发布时间】:2012-12-05 12:00:26 【问题描述】:

我有一个表单,它的主面板是一个 FlowLayoutPanel,这正是我想要打印的(它被设计成看起来像一个格式很好的文档......没有按钮等......你右键单击命令) .

因此,我利用 DrawToBitmap 实现几乎免费的打印...它会自动为该大小正确流动其内容。然后,我只使用 DrawToBitmap 将该 FlowLayoutPanel 及其所有内容呈现到打印页面。我什至可以通过将窗口增大到大于页面大小(相同的纵横比)来缩放以适应,然后缩小从 DrawToBitmap 获得的位图。效果很好...

但它仅在您的屏幕大于页面大小时才有效!因为任何将 Form 或 Control 的大小调整为大于屏幕大小 + 12 像素的任何尝试都会遭到阻挠。

啊!!如果您要通过拒绝调整大于屏幕的大小来扼杀它的适用性,为什么要用 DrawToBitmap 的简单性和实用性来取笑我呢? (修辞)

我的问题:

有没有办法绕过这个限制并让 Form 或 FlowLayoutPanel 调整为大于屏幕的大小?

如果没有,有没有办法到达 FlowLayoutPanel 的滚动表面(不仅仅是滚动到视图中的部分),以便我可以调整它的大小以匹配打印的页面,并且可以在其上调用 DrawToBitmap?

如果没有,是否有其他方法可以利用我现有的布局功能进行打印?或者我是否坚持重写所有 WinForms 代码只是为了生成相同的位图,如果我的屏幕比我的打印页面大,它已经生成了??

【问题讨论】:

您真的看过打印输出吗?您一定已经注意到屏幕上的每个像素是如何在纸上变成 6x6 的斑点的。特别是在抗锯齿文本上非常难看。在提交糟糕的解决方案之前比较 PrintDocument 的输出。 是的,我们已经查看了打印输出...没有 6x6 斑点。文字还算流畅。如果我们正在执行屏幕抓取 (CopyFromScreen),那么我们会看到您在说什么……但我们不是。我们正在执行 DrawToBitmap,它调用 OnPrint 而不是 OnPaint,传递从打印机生成的位图/设备上下文......具有高 DPI......所以,当它向其绘制文本时,它使用打印机的更高分辨率(尽管像素尺寸保持不变)。它实际上工作得非常好。 话虽如此,它不是 Postscript 质量的文本......但我们的应用程序并没有尝试生成杂志质量的文档......它是一个工程应用程序......它的分辨率很高工程师们很高兴阅读它(并在上面画画等)。但是,如果您创建用于出版或销售的文档,这无疑不是最好的方法。 【参考方案1】:

我不确定,但是否有可能以虚拟方式完成这一切。即:

Dim FLP as FlowLayoutPanel = Form1.FlowLayoutPanel1
For Each flp_subobject as Object in FlowLayoutPanel.Children
    FLP.Children.Add(flp_subobject)
Next
FLP.Height = MASSIVEHEIGHT
FLP.Width = MASSIVEWIDTH
DrawToBitmapFunction(FLP)

我就是这样做的,并不是说我在超过屏幕限制等方面有很多经验。让我知道这是怎么回事,因为它几乎是当场直接从我的脑海中浮现出来的:D

【讨论】:

我仍在尝试,但似乎所有控件的宽度和高度设置都已最大化到屏幕尺寸。我可以重新实现 FlowLayoutPanel 的逻辑,以便我从每个孩子那里获取一个位图,然后自己将它们按流布局组装到打印表面上……但我讨厌仅仅因为一个“最大”变量而重新发明***。

以上是关于如何调整表单或 FlowLayoutPanel 的大小以打印大于屏幕尺寸?的主要内容,如果未能解决你的问题,请参考以下文章

如何防止用户调整表单的大小?

C#winform 怎么设置自动竖直滚动条

如果调整窗体大小,如何使用鼠标坐标显示或隐藏面板?

停靠更改时,UserControl 未在 FlowLayoutPanel 中呈现

如何随着分辨率的变化自动调整大小和调整表单控件

如何动态添加SplitContainer c#