Печать двух вкладок на TabControl в VB.NET

Я использую Visual Studio Express 2013, VB. Насколько я могу упростить проблему, у меня есть форма с элементом управления вкладками, который имеет 2 вкладки. Я хочу распечатать обе вкладки одним нажатием одной кнопки. В настоящее время я пытаюсь использовать CreateGraphics на отдельных вкладках, но я просто печатаю первую вкладку на обеих страницах. Вот мой код, может кто-нибудь посмотреть, что я делаю неправильно или я нахожусь в совершенно неправильных строках. Мне кажется, что CreateGraphics не извлекает правильную графику вкладок.

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

person Anthony Wells    schedule 15.07.2014    source источник
comment
Вы не можете вызвать CreateGraphics() на невыбранной вкладке. Сначала вам нужно будет выбрать его и вызвать метод TabPage.Update(), чтобы убедиться, что он закончил рисование. Вместо этого рассмотрите возможность использования метода TabPage.DrawToBitmap().   -  person Hans Passant    schedule 16.07.2014
comment
Я пробовал, это не работает. Я думаю, что проблема может заключаться в том, что я уже инициировал печать, поэтому выбор вкладки просто не работает. Он отлично работает, если я разделяю страницы на 2 отдельные строки PrintDocument1.Print() (совсем не то, что я хочу). Я буду продолжать играть с ним, и если я найду ответ, я опубликую его здесь. Сначала я попробую DrawToBitmap. Спасибо обоим.   -  person Anthony Wells    schedule 16.07.2014
comment
Да, DrawToBitmap работает. Код в двух подпрограммах GetImage теперь... отсортирован, большое спасибо. Код проще, чем CreateGraphics, я только что изменил два сабвуфера GetImage. Для этого не нужно выбирать вкладки. Код здесь выглядит некрасиво. Я опубликую его через 8 часов, когда мне разрешат, я еще недостаточно авторитетен.   -  person Anthony Wells    schedule 16.07.2014


Ответы (2)


Пробовали ли вы выбрать вторую вкладку перед созданием графики с помощью SelectTab?

Вы также можете добавить к этой строке точку останова, чтобы убедиться, что она вызывается: e.Graphics.DrawImage(GetImage2(), e.MarginBounds)

person Dave 5709    schedule 15.07.2014
comment
Да, это не сработало, поэтому я вынул его, но на всякий случай вставил снова, и он все еще не работает. И я пробовал точки останова везде, поэтому есть два GetImage Subs, я попробовал один проход на странице, а затем разделил их, чтобы посмотреть, не изолирует ли это проблему больше. Неудачно. Спасибо. - person Anthony Wells; 16.07.2014

Вот код, который работает.

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
person Anthony Wells    schedule 16.07.2014