O forse sono io che non capace di farla funzionare in maniera ottimale
Ho una picture box, sulla quale eseguo vari DrawRectangleS.
Lo sfondo è bianco dato dato da una bella
Dim gr As Graphics = PictureBox1.CreateGraphics
gr.Clear(Color.White)
Ho provato a remmare il clear, inserendo questa riga di testo:
PictureBox1.BackgroundImage = New Bitmap("indirizzo immagine")
e anche
PictureBox1.BackgroundImage = Image.FromFile("indirizzo immagine")
ma il risultato è sempre lo stesso: la form carica l'immagine di background, ci disegna sopra i Rettangoli, e poi è come se ci caricasse ancora la background image xk i rettangoli scompaiono graficamente (ma ci sono ancora, xk ho impostato un msgbox per ogni click all'interno dei rettangoli, e anche non vedendoli, se per caso ci clicco sopra la msgbox viene fuori, quindi fisicamente ci sono)
Vi posto il codice:
codice:
Imports System.Drawing
Imports System.Drawing.Drawing2D
Imports System.Drawing.Imaging
Imports System.Drawing.Text
Public Class gdivb
Dim list As New List(Of c_ombrellone)
Dim x As Integer
Dim y As Integer
Dim Zoom As Integer = 100
Dim StepX As Integer = 5
Dim StepY As Integer = 5
Private Sub PictureBox1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox1.Click
For Each ombrellone As c_ombrellone In list
ombrellone.zoom = ComboBox1.SelectedItem
If (ombrellone.xBegin <= x) And (ombrellone.xEnd >= x) And (ombrellone.yBegin <= y) And (ombrellone.yEnd >= y) Then
If (ombrellone.xBegin <= x) And (x <= ombrellone.xBegin + ombrellone.w / 3) And (y >= ombrellone.yBegin + ombrellone.h / 2) And (ombrellone.yEnd >= y) Then
MsgBox(ombrellone.Testo + " quadrato di sinistra.")
Exit For
ElseIf (ombrellone.xBegin + ombrellone.w / 3 * 2 <= x) And (x <= ombrellone.xEnd) And (y >= ombrellone.yBegin + ombrellone.h / 2) And (ombrellone.yEnd >= y) Then
MsgBox(ombrellone.Testo + " quadrato di destra")
Exit For
Else
MsgBox(ombrellone.Testo)
Exit For
End If
End If
Next
End Sub
Private Sub PictureBox1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown
x = e.X
y = e.Y
End Sub
Private Sub gdivb_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
ComboBox1.Items.Add("100")
ComboBox1.Items.Add("120")
ComboBox1.Items.Add("150")
ComboBox1.Items.Add("180")
ComboBox1.Items.Add("200")
ComboBox1.SelectedItem = "100"
End Sub
Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged, Button1.Click
Zoom = CInt(ComboBox1.SelectedItem)
PictureBox1.BackgroundImage = New Bitmap("C:\Users\Luca\Documents\Visual Studio 2010\Projects\Ombrelloni\Ombrelloni\Chrysanthemum.jpg")
Dim gr As Graphics = PictureBox1.CreateGraphics
'gr.Clear(Color.White)
Dim w As Integer = 50
Dim h As Integer = 30
Dim f As New Font("Verdana", 8, FontStyle.Bold)
For i As Integer = 1 To 10
For j As Integer = 1 To 33
Dim o As New c_ombrellone("Ombrellone " + i.ToString + " - " + j.ToString, (j - 1) * (w + StepX), (i - 1) * (h + StepY), w, h, Color.Red, "Verdana", 8, FontStyle.Bold)
o.zoom = Zoom
list.Add(o)
o.ScriviQuadrato(gr, Brushes.Black)
Next
Next
End Sub
La combobox la uso per zoommare (ma per il problema che vi pongo non è importante, ve lo dico per completezza), e vi faccio notare che il disegno viene creato su pressione del bottone Button1 
Vi posto inoltre la classe c_ombrellone:
codice:
Public Class c_ombrellone
Property IDPrenotazione As Integer
Property Testo As String
Property zoom As Integer = 100
Dim mxBegin As Integer
ReadOnly Property xBegin As Integer
Get
Return CInt(mxBegin * zoom / 100)
End Get
End Property
Dim mybegin As Integer
ReadOnly Property yBegin As Integer
Get
Return CInt(mybegin * zoom / 100)
End Get
End Property
Dim mxend As Integer
ReadOnly Property xEnd As Integer
Get
Return CInt(mxend * zoom / 100)
End Get
End Property
Dim myEnd As Integer
ReadOnly Property yEnd As Integer
Get
Return CInt(myEnd * zoom / 100)
End Get
End Property
ReadOnly Property w As Integer
Get
Return xEnd - xBegin
End Get
End Property
ReadOnly Property h As Integer
Get
Return yEnd - yBegin
End Get
End Property
Property BackColor As Color
Property Font As Font
Sub New()
End Sub
Sub New(ByVal n As String, ByVal x As Integer, ByVal y As Integer, ByVal w As Integer, ByVal h As Integer, ByVal backColor As Color, ByVal fontFamily As String, ByVal fontSizeEm As Integer, ByVal fontStile As FontStyle)
Testo = n
mxBegin = x
mybegin = y
mxend = x + w
myEnd = y + h
Me.BackColor = BackColor
Font = New Font(fontFamily, fontSizeEm, fontStile)
End Sub
Sub ScriviQuadrato(ByRef gr As Graphics, ByVal Brush As System.Drawing.Brush)
Dim r As New RectangleF(xBegin, yBegin, w, h)
Dim l As New RectangleF(xBegin, yBegin + h / 2, w / 3, h / 2)
Dim s As New RectangleF(xBegin + w / 3 * 2, yBegin + h / 2, w / 3, h / 2)
gr.DrawRectangles(Pens.Blue, New RectangleF() {r})
gr.DrawRectangles(Pens.Black, New RectangleF() {l})
gr.DrawRectangles(Pens.Black, New RectangleF() {s})
Dim sa = System.Drawing.StringFormat.GenericDefault
sa.Alignment = StringAlignment.Center
sa.LineAlignment = StringAlignment.Near
gr.DrawString(Testo, Font, Brush, r, sa)
End Sub
End Class