Torna al Thread
Private Sub tuoPrintDocument_PrintPage(ByVal sender As Object, ByVal e As PrintPageEventArgs) Handles tuoPrintDocument.PrintPage
'Crea un'immagine su cui disegnare
Dim bmp As New Bitmap(Me.ClientSize.Width, Me.ClientSize.Height)
'Ottiene il grafico della bitmap per poterci disegnare
Using g As Graphics = Graphics.FromImage(bmp)
'Colora lo sfondo dell'immagine del colore della Form
g.Clear(Me.BackColor)
End Using
'Ordina i controlli in base allo z-order
pictureBoxes.Sort(AddressOf SortByZOrder)
labels.Sort(AddressOf SortByZOrder)
'Cicla fra tutte le immagini
For Each img As PictureBox In pictureBoxes
'e le disegna sulla bitmap
img.DrawToBitmap(bmp, img.Bounds)
Next
'Cicla fra tutte le label
For Each lab As Label In labels
'E le disegna sull'immagine
lab.DrawToBitmap(bmp, lab.Bounds)
Next
'Disegna l'immagine sulla pagina da stampare
e.Graphics.DrawImage(bmp, 0, 0)
End Sub
Function SortByZOrder(ByVal a As Control, ByVal b As Control) As Integer
'Se i due controlli non si sovrappongono ritorna 0
If Not a.Bounds.IntersectsWith(b.Bounds) Then
Return 0
End If
'Se invece i controlli si sovrappongono, determina qual è quello che sta più in alto
'Ottiene il rettangolo di intersezione
Dim intersect As Rectangle = Rectangle.Intersect(a.Bounds, b.Bounds)
'Ottiene un punto interno al rettangolo
Dim pt As New Point(intersect.Left + intersect.Width / 2, intersect.Top + intersect.Height / 2)
'Crea una lista temporanea di controlli precedenti i due in ordine-z
Dim tmp As New List(Of Control)
'Ottiene il controllo superiore finchè non è uno dei due a o b
Dim top As Control
Do
'Ottiene il controllo più in alto
top = Me.GetChildAtPoint(pt, GetChildAtPointSkip.Invisible)
'Se non è nè a nè b, rende momentaneamente invisibile il controllo
If (top IsNot a AndAlso top IsNot b) Then
top.Visible = False
tmp.Add(top)
Else
Exit Do
End If
Loop
'Adesso rende di nuovo visibili i controlli
For Each ctr As Control In tmp
ctr.Visible = True
Next
'Ritorna 1 se il controllo è a, -1 se è b
If top Is a Then
Return 1
ElseIf top Is b Then
Return -1
End If
Return 0
End Function