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

나는 그것이 작동하지 않는 것을 시도했다. 문제는 이미 인쇄를 시작한 것일 수 있으므로 탭을 선택하는 것만으로는 효과가없는 것 같습니다. 페이지를 2 개의 분리 된 PrintDocument1.Print() 행으로 분할하면 제대로 작동합니다 (원하는 것은 아님). 나는 그걸로 놀아나고, 대답을 찾으면 여기에 게시 할 것이다. 먼저 DrawToBitmap을 시도하겠습니다. 둘 다 고마워. –

+0

예, DrawToBitmap이 작동합니다. 두 개의 GetImage 잠수함에있는 코드가 이제 정렬되었습니다. 대단히 감사합니다. 코드는 CreateGraphics보다 간단합니다. 두 개의 GetImage 서브를 변경했습니다. 이 작업을 수행하기 위해 탭 페이지를 선택하지 않아도됩니다. 코드는보기 흉하게 보입니다. 허용 될 때 8 시간 후에 게시 할 예정입니다. 아직 충분히 평판이 나지 않습니다. –

답변

0

SelectTab으로 그래픽을 만들기 전에 두 번째 탭을 선택해 보셨습니까?

또한이 호출되고 있는지 확인하기 위해이 라인에 중단 점을 추가 할 수 있습니다 : 여기 e.Graphics.DrawImage(GetImage2(), e.MarginBounds)

+0

예, 작동하지 않아서 꺼내졌지만, 다시 넣었는지 여전히 작동하지 않습니다. 그리고 나는 모든 곳에서 중단 점을 시도했기 때문에 GetImage Sub가 두 개인 이유는 무엇입니까? 페이지에서 전달한 다음 문제를 더 많이 분리했는지 확인하려고했습니다. 불운. 감사. –

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