Drawing (Zeichnungsobjekt verschwindet nach minimieren der Form)

jimboo

Mitglied
Hi,

ich habe eine Elipse in einer Picturebox erstellt. Diese wird auch korrekt dargestellt. Allerdings wenn ich die Form1 einmal minimiere und wieder maximiere ist die Elipse verschwunden. :confused:

Das gleiche passiert wenn ich den Style, genauer die Background Color einiger Zellen verändere. (möchte damit eine Legende zum Schaubild entsprechend der Zeilen darstellen)
(Sprache: VB.NET)
 
Zuletzt bearbeitet:
Hallo, du musst die Grafik in dem Paint - Ereignis zeichnen oder die Sub in der gezeichnet wird im Paint - Ereignis aufrufen.
 
' Einfaches Kreisdiagramm:
Private Sub DrawPie(ByVal nValue() As Integer, ByVal oOutput As Object)
' RGB-Farben
Dim arrayRot(10) As Integer
Dim arrayGelb(10) As Integer
Dim arrayBlau(10) As Integer

arrayRot(0) = 204 ' dungelblau
arrayGelb(0) = 0
arrayBlau(0) = 0

arrayRot(1) = 204
arrayGelb(1) = 0
arrayBlau(1) = 153

arrayRot(2) = 153
arrayGelb(2) = 0
arrayBlau(2) = 204

arrayRot(3) = 102
arrayGelb(3) = 0
arrayBlau(3) = 204

arrayRot(4) = 0
arrayGelb(4) = 0
arrayBlau(4) = 204

arrayRot(5) = 0
arrayGelb(5) = 102
arrayBlau(5) = 204

arrayRot(6) = 0
arrayGelb(6) = 204
arrayBlau(6) = 204

arrayRot(7) = 0
arrayGelb(7) = 204
arrayBlau(7) = 51

arrayRot(8) = 204
arrayGelb(8) = 204
arrayBlau(8) = 0

arrayRot(9) = 204
arrayGelb(9) = 102
arrayBlau(9) = 0

Dim nColor() As Color = { _
Color.FromArgb(arrayRot(0), arrayGelb(0), arrayBlau(0)), _
Color.FromArgb(arrayRot(1), arrayGelb(1), arrayBlau(1)), _
Color.FromArgb(arrayRot(2), arrayGelb(2), arrayBlau(2)), _
Color.FromArgb(arrayRot(3), arrayGelb(3), arrayBlau(3)), _
Color.FromArgb(arrayRot(4), arrayGelb(4), arrayBlau(4)), _
Color.FromArgb(arrayRot(5), arrayGelb(5), arrayBlau(5)), _
Color.FromArgb(arrayRot(6), arrayGelb(6), arrayBlau(6)), _
Color.FromArgb(arrayRot(7), arrayGelb(7), arrayBlau(7)), _
Color.FromArgb(arrayRot(8), arrayGelb(8), arrayBlau(8)), _
Color.FromArgb(arrayRot(9), arrayGelb(9), arrayBlau(9))}

' Graphics-Objekt
Dim g As Graphics = oOutput.CreateGraphics

' Außmaße
Dim nWidth As Integer = oOutput.Width
Dim nHeight As Integer = oOutput.Height

' Summe aller Werte ermitteln
Dim nMax As Integer
Dim i As Integer

For i = 0 To UBound(nValue)
nMax += nValue(i)
Next

Dim nPercent As Integer
Dim nAngle As Integer
Dim nStartAngle As Integer
Dim brush As System.Drawing.SolidBrush
Dim nColIndex As Integer = 0

' Kreis zeichnen
For i = 0 To UBound(nValue)
brush = New System.Drawing.SolidBrush(nColor(nColIndex))

' Größe des Kreissegment berechnen
nPercent = CInt(nValue(i) / nMax * 100 + 0.5)
nAngle = 360 * (nPercent / 100)

' Anfangswinkel
If nStartAngle + nAngle > 360 Then nAngle = 360 - nStartAngle

' Segment zeichnen
g.FillPie(brush, New Rectangle(0, 0, nWidth, nHeight), nStartAngle, nAngle)

' neuen Anfangspunkt berechnen
nStartAngle += nAngle

' nächster Farbwert
nColIndex += 1
If nColIndex > UBound(nColor) Then nColIndex = 0
Next i
g.Dispose()
End Sub

wie müsste ich dann den code ändern? sorry kenne vb noch nicht so :suspekt:
 
Hi

1. Pack den Code bitte in Code-Tags, dass kann doch keiner lesen!
2. Wie wincnc schon geschrieben hat, musst du das ganze im OnPaint zeichnen. Dafür musst du die entsprechende Methode überschreiben.
C#:
protected override void OnPaint(PaintEventArgs e)
{
    // draw something
}
 
' Einfaches Kreisdiagramm:
Private Sub DrawPie(ByVal nValue() As Integer, ByVal oOutput As Object)
' RGB-Farben
Dim arrayRot(10) As Integer
Dim arrayGelb(10) As Integer
Dim arrayBlau(10) As Integer

arrayRot(0) = 204 ' dungelblau
arrayGelb(0) = 0
arrayBlau(0) = 0

arrayRot(1) = 204
arrayGelb(1) = 0
arrayBlau(1) = 153

arrayRot(2) = 153
arrayGelb(2) = 0
arrayBlau(2) = 204

arrayRot(3) = 102
arrayGelb(3) = 0
arrayBlau(3) = 204

arrayRot(4) = 0
arrayGelb(4) = 0
arrayBlau(4) = 204

arrayRot(5) = 0
arrayGelb(5) = 102
arrayBlau(5) = 204

arrayRot(6) = 0
arrayGelb(6) = 204
arrayBlau(6) = 204

arrayRot(7) = 0
arrayGelb(7) = 204
arrayBlau(7) = 51

arrayRot(8) = 204
arrayGelb(8) = 204
arrayBlau(8) = 0

arrayRot(9) = 204
arrayGelb(9) = 102
arrayBlau(9) = 0

Dim nColor() As Color = { _
Color.FromArgb(arrayRot(0), arrayGelb(0), arrayBlau(0)), _
Color.FromArgb(arrayRot(1), arrayGelb(1), arrayBlau(1)), _
Color.FromArgb(arrayRot(2), arrayGelb(2), arrayBlau(2)), _
Color.FromArgb(arrayRot(3), arrayGelb(3), arrayBlau(3)), _
Color.FromArgb(arrayRot(4), arrayGelb(4), arrayBlau(4)), _
Color.FromArgb(arrayRot(5), arrayGelb(5), arrayBlau(5)), _
Color.FromArgb(arrayRot(6), arrayGelb(6), arrayBlau(6)), _
Color.FromArgb(arrayRot(7), arrayGelb(7), arrayBlau(7)), _
Color.FromArgb(arrayRot(8), arrayGelb(8), arrayBlau(8)), _
Color.FromArgb(arrayRot(9), arrayGelb(9), arrayBlau(9))}

' Graphics-Objekt
Dim g As Graphics = oOutput.CreateGraphics

' Außmaße
Dim nWidth As Integer = oOutput.Width
Dim nHeight As Integer = oOutput.Height

' Summe aller Werte ermitteln
Dim nMax As Integer
Dim i As Integer

For i = 0 To UBound(nValue)
nMax += nValue(i)
Next

Dim nPercent As Integer
Dim nAngle As Integer
Dim nStartAngle As Integer
Dim brush As System.Drawing.SolidBrush
Dim nColIndex As Integer = 0

' Kreis zeichnen
For i = 0 To UBound(nValue)
brush = New System.Drawing.SolidBrush(nColor(nColIndex))

' Größe des Kreissegment berechnen
nPercent = CInt(nValue(i) / nMax * 100 + 0.5)
nAngle = 360 * (nPercent / 100)

' Anfangswinkel
If nStartAngle + nAngle > 360 Then nAngle = 360 - nStartAngle

' Segment zeichnen
g.FillPie(brush, New Rectangle(0, 0, nWidth, nHeight), nStartAngle, nAngle)

' neuen Anfangspunkt berechnen
nStartAngle += nAngle

' nächster Farbwert
nColIndex += 1
If nColIndex > UBound(nColor) Then nColIndex = 0

g.Dispose()
End Sub

Ehrlich gesagt ich verstehe es nicht, außerdem bin ich bei VB.NET und nicht C++ :rolleyes:
 
Hi

1. Ist das C#-Code, was ich geschrieben hab und
2. Ändert es nichts an dem was ich geschrieben hab:
Du sollst den hier geposteten Code in Code-Tags setzen um ihn lesbarer zu machen und außerdem die Methode OnPaint überschreiben und deinen Code darin ausführen! Hast du dir die Methode mal angeschaut?!
 
Füge deiner Picturebox das Event Paint hinzu

Füge da den Code rein und ändere die Zeile:
Code:
Dim g As Graphics = oOutput.CreateGraphics
um in:
Code:
Dim g As Graphics = e.Graphics()

Dann müsste es gehen.

Wenn du die Ellipse mehrmals zeichnen willst, sich also Werte ändern, dann ruf Picturebox.Refresh() auf. (Mit Picturebox meine ich den NAMEN deines Picturebox-Objekts...)

PS: Sollte sich das Objekt mal vergrößern/verkleinern (z.b. wenn du z.b. Docking verwendest), dann rufe im Resize-Ereignis auch noch Picturebox.Refresh() auf.
 
Das hilft nicht...
Hatte zudem schon vorher folgendes definiert:
Code:
With KreisBox
    ' Kreis zeichnen (PictureBox wird als Ausgabe-Objekt übergeben)
    DrawPie(nValue, KreisBox)
End With
 
KreisBox ist meine PictureBox.
Das Ganze wird in einer Routine Abgerufen, wobei DrawPie eine eigenständige Methode ist.
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück