打印可滚动的表单

时间:2013-03-07 15:48:44

标签: vb.net vb.net-2010 printform

我有一个可滚动的表单,我想完全打印。

我已尝试使用此代码进行打印:

    Private Sub btnPrint_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPrint.Click
    Me.PrintForm.PrintAction = Printing.PrintAction.PrintToPreview
    Me.PrintForm.Print(Me, PowerPacks.Printing.PrintForm.PrintOption.Scrollable) 
End Sub

结果并不准确。

为了证明我的问题,这里有一些照片:

这是我想要的结果(当然我希望它也可以打印所有可滚动的内容)

正如您所看到的,此图像包含图像所需的所有宽度,但由于它是一个打印屏幕图像,因此它不包含我希望在我的可打印版本中具有的可滚动区域表格。 Good result

这是我从我的代码中得到的:

正如你在这里看到的那样,我只获得了大约60%的表格宽度和50%的高度,显然,我没有得到可滚动的区域。

Bad result

我并不真正关心我想要打印整个表格的质量,包括可滚动区域。

5 个答案:

答案 0 :(得分:2)

在这一行:

PrintForm1.Print(Me, PowerPacks.Printing.PrintForm.PrintOption.Scrollable)

如果你有一个可滚动的表单,看起来PrintOption.Scrollable只会起作用。您在表单中有一个可滚动的控件(可能是Panel)。在这种情况下,其区域不会扩展到打印机上。比较:

可滚动控制:

enter image description here

打印为:

enter image description here

可滚动的表单:

enter image description here

打印为:

enter image description here

根据this official answer from Microsoft,使用PrintForm无法捕获可滚动控件。如果使用PrintDocument and some custom coding,则可以针对简单情况(例如可滚动的TextBox)执行此操作。在您的情况下,您可能需要更多自定义编码。处理PrintDocument1.PrintPage看起来是最好的起点,如果您愿意的话。

答案 1 :(得分:1)

根据您展示的内容......看起来可滚动区域就像Panel一样容器。如果是这种情况,打印表单不是问题,它打印可滚动控件。

看看这个项目从控件创建一个位图: http://www.codeproject.com/Articles/35734/Print-a-WinForms-User-Control

编辑: 第二个想法,我不认为该链接的代码也解决了实际的滚动问题。

我认为你需要做两件事之一: 1)暂时调整面板的大小,使滚动条消失,然后将其调整大小 2)构建一个控件(也许是一个“可打印的版本”表单),它没有嵌套的可滚​​动元素,并优雅地处理像分页这样的东西。

选项#2可能听起来很多工作,但我认为您可以很快做一些事情:创建一个新面板,克隆您想要打印的每个控件并将其添加到面板(根据需要调整大小以避免滚动) ,打印面板,然后处理面板。

答案 2 :(得分:1)

我认为你的回答是the article 您所需要的只是引用FormPrinting库(或将源代码导入您的解决方案)。

Private Sub btnPrint_Click(object sender, EventArgs e)
        {
            var fp = new FormPrinting.FormPrinting(this);                
            fp.Print();
        }

将完成打印工作 我测试了这个库,对图像和......等可滚动内容没有任何问题。

答案 3 :(得分:0)

检查MSDN论坛的代码here 像这样的代码

  1. 在“工具箱”中,单击“Visual Basic PowerPacks”选项卡,然后将PrintForm组件拖到表单上。

  2. PrintForm组件将添加到组件托盘中。

  3. 在“属性”窗口中,将PrintAction属性设置为PrintToPrinter。

  4. 在适当的事件处理程序中添加以下代码(例如,在打印按钮的Click事件处理程序中)。

    PrintForm1.Print(Me, PowerPacks.Printing.PrintForm.PrintOption.Scrollable)
    

    here 得到了和你一样的答案。

答案 4 :(得分:0)

我有一个类似的问题,我能够解决没有任何额外的库或扩展。大多数Forms控件都可以使用DrawToBitmap方法。

private void tbRegPersPlacÅrArb_TextChanged(object sender, EventArgs e)
    {
       Compare();
    }
private void Kvarattfördela_TextChanged(object sender, EventArgs e)
    {
       Compare();
    }