2013-03-07 135 views
1

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

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

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

我真的不关心质量我只是想它打印整个表单,包括滚动,能区。

回答

1

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

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

将执行打印作业。
我已经测试过图书馆,没有可滚动的内容像图像和....

+0

我无法找到一个VB.NET代码源,此外,我还没有理解如何使用它,尽管我阅读了文章 – kfirba 2013-03-20 09:06:44

+0

为了开始(测试功能),只需将c#项目(在文章中)添加到你的解决方案添加对该项目的引用。该图书馆被称为“FormPrinting”,然后使用我在我的答案中提到的来源将完成剩下的工作。测试功能并通知我朋友。 – 2013-03-20 10:18:19

+0

嗯,我的电脑上没有任何C#编译器,所以这会出现问题:s – kfirba 2013-03-20 14:04:22

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,则可以在简单情况下执行此操作,例如可滚动的文本框。在你的情况下,你可能需要更多的自定义编码。如果你愿意,处理PrintDocument1.PrintPage看起来是最好的开始。

1

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

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

编辑: 关于第二个想法,我不认为在那个链接代码,通过解决实际问题的滚动。

我想你会需要做两件事情:1 )暂时调整面板足够大,滚动条消失然后调整回 2)建立一个控制(也许是“可打印版本”的形式)没有嵌套的可滚​​动元素,并优雅地处理像分页这样的东西。

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

+0

但是我还可以从表格本身打印一些区域吗?这是在深夜,所以我会明天早上检查它;)希望我会找到我的解决方案:)我会保持你更新,一旦我明天尝试 – kfirba 2013-03-14 21:49:12

+0

那么,这将是棘手的组合形式位图/面板位图。您可能会考虑的是将完全填充表单的单个面板对接,然后将子控件添加到该面板并打印单个面板。或者 - 如果您有这样做的自由:制作一个“可打印”版本的表单,更好地考虑分页等问题(在多个页面上打印时,单个长图像会看起来很垃圾)。 – GojiraDeMonstah 2013-03-14 22:04:59

+0

我试过你给我的链接,我不知道它是否工作,因为它会自动发送报告进行打印。如何在打印之前显示预览? – kfirba 2013-03-15 09:00:45

0

检查代码here 了这样的代码

  1. 在工具箱的MSDN论坛,点击Visual Basic中的PowerPack选项卡,然后拖动PrintForm组件到窗体。

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

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

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

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

here 了作为同样的问题,并已回答。

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