Winforms 使用PrintDocument组件c打印带有控件的WinForm#

Winforms 使用PrintDocument组件c打印带有控件的WinForm#,winforms,visual-studio-2010,c#-4.0,printdocument,Winforms,Visual Studio 2010,C# 4.0,Printdocument,我真的不想让别人替我做我的工作,我真的很想知道正确的方向 我有几张表格需要打印。它们都由多个DataGridView和其他控件组成。工作卡、制造表、库存切割清单、报价等 我在互联网上尝试了很多可能的解决方案。由于分辨率低,PrintForm组件实际上是无用的。我尝试了Crystal Report,取得了一些成功,我使用它生成并打印报价和发票 “捕获”表单(位图)…(我想在我的例子中,它是打印表单的一个更好的替代品)并不能阻止它 我相当缺乏动力,因为这是测试前我应用程序的最后一部分。 我真的很想

我真的不想让别人替我做我的工作,我真的很想知道正确的方向

我有几张表格需要打印。它们都由多个DataGridView和其他控件组成。工作卡、制造表、库存切割清单、报价等

我在互联网上尝试了很多可能的解决方案。由于分辨率低,PrintForm组件实际上是无用的。我尝试了Crystal Report,取得了一些成功,我使用它生成并打印报价和发票

“捕获”表单(位图)…(我想在我的例子中,它是打印表单的一个更好的替代品)并不能阻止它

我相当缺乏动力,因为这是测试前我应用程序的最后一部分。 我真的很想了解和学习关于PrintDocument组件的一切,以便最终解决这个问题并获得一些VS打印经验

作为我的最后手段,我现在就要深入研究iText Sharp了。因此,请告诉我,如果它将被证明是徒劳的(至少在我的情况下;),将不胜感激

感谢善良的先生或女士为您的时间和可能您的知识

亲切的问候

赫尔曼·维奎尔 在Crystal Reports中也会生成类似的报价表

我需要打印的表格。。。表格的数量因订购产品的类型和数量而异

编辑:

我现在已经适应了

我怎样才能确保这是适合一页? 目前表单右侧的一部分缺失

private void CaptureScreen()
        {
            Graphics mygraphics = this.CreateGraphics();
            Size s = this.Size;
            memoryImage = new Bitmap(s.Width, s.Height, mygraphics);
            Graphics memoryGraphics = Graphics.FromImage(memoryImage);
            IntPtr dc1 = mygraphics.GetHdc();
            IntPtr dc2 = memoryGraphics.GetHdc();
            BitBlt(dc2, 0, 0, this.ClientRectangle.Width, this.ClientRectangle.Height, dc1, 0, 0, 13369376);
            mygraphics.ReleaseHdc(dc1);
            memoryGraphics.ReleaseHdc(dc2);
        }

表单上的控件经过优化,可在低分辨率光栅设备(屏幕)上呈现。
打印经过优化,可在高分辨率光栅设备(打印机)上渲染

因此,如果将表单渲染到打印机,可能会得到非常小的打印,或者是低分辨率的大打印(如屏幕)

我不是印刷专家。。。但是,我能想到的在纸上打印表单而不使用低分辨率大而丑陋的像素的唯一方法是重新渲染所有表单对象:枚举表单上的所有控件,并按照您想要的方式自己绘制控件,这样您就可以准确地决定如何以高分辨率渲染它们。这样您就可以决定按钮边框的外观,一个组合框,随便什么

实现这样的东西看起来是一项非常艰巨的任务

更新
另一个更简单的选项是使用位图到光栅转换器。
您可以将屏幕抓取为位图,将位图传递到光栅-矢量转换器中,获得位图的矢量化版本,然后可以直接打印此基于矢量的图像

但自动光栅到矢量转换可能会起作用。。。或者可能不起作用。
您的里程可能会有所不同

也许您可以尝试“手动”抓取屏幕并使用一些免费工具进行位图到矢量的转换,例如(启动Inkscape,导入位图,然后进入菜单路径\跟踪位图,并尝试各种选项(颜色、BW、平滑…)。

然后,如果你有好的结果,也许可以集成到你的应用程序中。

那些担心保存树的人(像我一样)所有这些表单最终都会出现在每个制造机器的触摸屏上:)[这也是我反对在这些表单中使用Crystal report的动机]而且大多数订单都是在线完成的,因此,客户将收到pdf格式的报价和发票:)。。。该公司只想从6月1日开始测试该软件。此时检查打印控制永远不会让任何人高兴,打印机的分辨率比显示器高6倍。所以每一个像素在纸上都会变成一个6x6的斑点。你刚刚忘记了你项目的另外90%,非常不清楚你希望我们做什么。@HansPassant如果我不清楚的话,非常抱歉。我知道打印控制绝对不是好的做法,尤其是在相对专业的环境中。(因此使用Crystal Reports作为客户文档。)这只是一个临时解决方案,正如我所说的,这些表单旨在显示在触摸屏上。我知道屏幕和打印机在分辨率上的差异:)我也不知道你说的“你刚刚忘记了你项目的其他90%”是什么意思。谢谢你的评论。我有麦克斯,首先谢谢你的回答。这听起来是一项相当大的工作。我认为在应用试验期间,最好将其吸收,并使制造表稍微模糊