2014-07-15 29 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