2

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

我已经尝试使用此代码打印它:

    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

结果根本不准确。

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

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

如您所见,此图像包含图像所需的所有宽度,但由于它是打印屏幕图像,因此它不包含我希望在可打印版本的表单中具有的可滚动区域。 好结果

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

正如你在这里看到的,我只得到了大约 60% 的表单宽度和 50% 的高度,而且很明显,我没有得到可滚动的区域。

结果不好

我并不真正关心质量,我只想让它打印整个表单,包括可滚动区域。

4

5 回答 5

3

在这一行:

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

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

可滚动控件:

在此处输入图像描述

打印为:

在此处输入图像描述

可滚动形式:

在此处输入图像描述

打印为:

在此处输入图像描述

根据Microsoft 的官方回答,使用 .c 无法捕获可滚动控件PrintForm。如果您使用PrintDocument 和一些自定义编码,则可以在简单的情况下使用它,例如可滚动的 TextBox。在您的情况下,您可能需要完成更多的自定义编码。处理PrintDocument1.PrintPage看起来是最好的起点,如果你能做到的话。

于 2013-03-14T18:29:12.220 回答
1

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

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

编辑:再想一想,我认为该链接上的代码也不能解决实际的滚动问题。

我认为您将需要做以下两件事之一:1)临时调整面板的大小,使滚动条消失,然后重新调整大小 2)构建一个没有的控件(可能是“可打印版本”表单)嵌套可滚动元素并优雅地处理分页等内容。

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

于 2013-03-14T19:03:22.663 回答
1

我认为您的答案在文章中
您需要的只是参考 FormPrinting 库(或将源导入您的解决方案)。

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

将完成打印工作。
我已经测试了该库,对可滚动内容(例如图像和...)没有任何问题。

于 2013-03-19T16:16:26.020 回答
0

在此处检查代码的 MSDN 论坛, 代码如下

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

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

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

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

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

这里得到了和 你一样的问题,并且得到了答案。

于 2013-03-15T03:44:03.740 回答
0

我有一个类似的问题,我可以在没有任何额外的库或扩展的情况下解决。大多数 Forms 控件都可以使用 DrawToBitmap 方法,这很简单。

    Dim ctrlColl As ControlCollection
    Dim i As Integer = 0

    ' Get collection of controls
    ctrlColl = Me.Controls

    ' create bitmap array
    Dim Bitmaps(ctrlColl.Count - 1) As Bitmap

    ' remove controls you have hidden before printing
    For Each ctrl As Control In ctrlColl
        If Not ctrl.Visible Then
            ctrlColl.Remove(ctrl)
        End If
    Next

    ' Loop through controls
    For Each ctrl As Control In ctrlColl
        ' create bitmap from control.DrawToBitmap
        Bitmaps(i) = New Bitmap(ctrl.Width, ctrl.Height)
        ctrl.DrawToBitmap(Bitmaps(i), ctrl.ClientRectangle)
        i = i + 1
    Next

    ' Print each bitmap in array
    i = 0
    For Each bmp As Bitmap In Bitmaps
        e.Graphics.DrawImage(bmp, New Point(ctrlColl(i).Location.X, ctrlColl(i).Location.Y))
        i = i + 1
    Next

End Sub
于 2016-10-18T21:33:32.643 回答