2013-03-07 64 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