2014-07-15 30 views
0

我正在使用Visual Studio express 2013,VB。儘可能簡化問題,我有一個帶有2個標籤頁的標籤控件。我想通過點擊一個按鈕來打印兩個標籤頁。目前我正嘗試在各個選項卡上使用CreateGraphics,但我只是在兩個頁面上都打印第一個選項卡。這裏是我的代碼,任何人都可以看到我做錯了什麼,或者如果我完全錯誤的線路。它在我看來像CreateGraphics沒有檢索正確的標籤圖形。在VB.NET的TabControl上打印兩個TabPages

Private Declare Auto Function BitBlt Lib "gdi32.dll" (ByVal hdcDest As IntPtr, ByVal nXDest As Integer, ByVal nYDest As Integer, ByVal nWidth As Integer, ByVal nHeight As Integer, ByVal hdcSrc As IntPtr, ByVal nXSrc As Integer, ByVal nYSrc As Integer, ByVal dwRop As System.Int32) As Boolean 
Private Const SRCCOPY As Integer = &HCC0020 
Private PagePrinting As Integer 

Private Sub ToolStripButton2_Click(sender As Object, e As EventArgs) Handles ToolStripButton2.Click 
    If PrintDialog1.ShowDialog() = DialogResult.OK Then 
     PagePrinting = 0 
     PrintDocument1.Print() 
    End If 
End Sub 

Private Sub PrintDocument1_PrintPage(sender As Object, e As PrintPageEventArgs) Handles PrintDocument1.PrintPage 
    If PagePrinting = 0 Then 
     e.Graphics.DrawImage(GetImage1(), e.MarginBounds) 
    Else 
     e.Graphics.DrawImage(GetImage2(), e.MarginBounds) 
    End If 
    PagePrinting = PagePrinting + 1 
    If PagePrinting = 2 Then e.HasMorePages = False Else e.HasMorePages = True 
End Sub 

Private Function GetImage1() As Bitmap 
    Dim me_gr As Graphics = Me.BillTabControl.TabPages("PAGE1").CreateGraphics 
    Dim bm As New Bitmap(Me.BillTabControl.TabPages("PAGE1").ClientSize.Width, Me.BillTabControl.TabPages("PAGE1").ClientSize.Height, me_gr) 
    Dim bm_gr As Graphics = Graphics.FromImage(bm) 
    Dim bm_hdc As IntPtr = bm_gr.GetHdc 
    Dim me_hdc As IntPtr = me_gr.GetHdc 
    BitBlt(bm_hdc, 0, 0, Me.BillTabControl.TabPages("PAGE1").ClientSize.Width, Me.BillTabControl.TabPages("PAGE1").ClientSize.Height, me_hdc, 0, 0, SRCCOPY) 
    me_gr.ReleaseHdc(me_hdc) 
    bm_gr.ReleaseHdc(bm_hdc) 
    GetImage1 = bm 
End Function 

Private Function GetImage2() As Bitmap 
    Dim me_gr As Graphics = Me.BillTabControl.TabPages("PAGE2").CreateGraphics 
    Dim bm As New Bitmap(Me.BillTabControl.TabPages("PAGE2").ClientSize.Width, Me.BillTabControl.TabPages("PAGE2").ClientSize.Height, me_gr) 
    Dim bm_gr As Graphics = Graphics.FromImage(bm) 
    Dim bm_hdc As IntPtr = bm_gr.GetHdc 
    Dim me_hdc As IntPtr = me_gr.GetHdc 
    BitBlt(bm_hdc, 0, 0, Me.BillTabControl.TabPages("PAGE2").ClientSize.Width, Me.BillTabControl.TabPages("PAGE2").ClientSize.Height, me_hdc, 0, 0, SRCCOPY) 
    me_gr.ReleaseHdc(me_hdc) 
    bm_gr.ReleaseHdc(bm_hdc) 
    GetImage2 = bm 
End Function 
+0

您無法在未選定的選項卡上調用CreateGraphics()。您必須先選擇它並調用TabPage.Update()方法以確保完成繪製。請考慮使用TabPage.DrawToBitmap()方法。 –

+0

我試過它不起作用。我認爲問題可能是我已經開始打印,所以選擇該選項卡似乎不起作用。它工作正常,如果我將頁面分成兩個單獨的PrintDocument1.Print()行(不是我想要的)。我會繼續玩,如果我找到答案,我會在這裏發佈。我會先嚐試DrawToBitmap。謝謝。 –

+0

是的,DrawToBitmap的作品。在兩個GetImage潛艇中的代碼現在...排序,非常感謝。該代碼比CreateGraphics更簡單,我剛剛更改了兩個GetImage子目錄。這些標籤不需要被選中就可以工作。代碼在這裏看起來很醜,我會在8小時內發佈它,當我被允許時,我還沒有足夠的信譽。 –

回答

0

您是否嘗試過在創建圖形前選擇第二個選項卡SelectTab

您可能還需要一個斷點添加到該行,以確保它被稱爲: e.Graphics.DrawImage(GetImage2(), e.MarginBounds)

+0

是的,我沒有工作,所以我把它拿出來 - 但只是爲了確保我再次放入它,它仍然不起作用。我試過了各處的斷點,這就是爲什麼有兩個GetImage Subs,我嘗試了一個傳入頁面,然後將它們分開,以查看是否更多地隔離了這個問題。沒有運氣。謝謝。 –

0

這裏是工作的代碼。

Private Function GetImage1() As Bitmap 
    Dim bm As New Bitmap(Me.BillTabControl.TabPages("PAGE1").ClientSize.Width, Me.BillTabControl.TabPages("PAGE1").ClientSize.Height) 
    Me.BillTabControl.TabPages("PAGE1").DrawToBitmap(bm, Me.BillTabControl.TabPages("PAGE1").ClientRectangle) 
    GetImage1 = bm 
End Function 

Private Function GetImage2() As Bitmap 
    Dim bm As New Bitmap(Me.BillTabControl.TabPages("PAGE2").ClientSize.Width, Me.BillTabControl.TabPages("PAGE2").ClientSize.Height) 
    Me.BillTabControl.TabPages("PAGE2").DrawToBitmap(bm, Me.BillTabControl.TabPages("PAGE2").ClientRectangle) 
    GetImage2 = bm 
End Function