VB.NET - In Paintbox Objekte erzeugen (zeichnen)

Hey,

Ja die Seite ist Klasse, danke!
Nochmal ein Problem beim Programmieren:
Code:
    Private Sub pictureBox1_Paint(ByVal sender As Object, ByVal e As PaintEventArgs) Handles PictureBox1.Paint
        If test = True Then 'Nach Klick auf einen Button wird test auf true gesetzt, die Funktion hier wird auch aufgerufen (Mit Haltepunkt geprüft)
            Objekte.Element(0).Pos1.Y = Objekte.Element(0).Pos1.Y + 10
            Objekte.Element(0).Pos2.Y = Objekte.Element(0).Pos2.Y + 10
'der Y-Punkt oben links und unten rechts wird um 10 pixel nach unten verschoben, Somit gelangt das Rechteck 10Pixel weiter nach unten -> funktioniert

'bmp wurde so deklariert:bmp = New Bitmap(My.Resources._08062008746)
            Using g As Graphics = Graphics.FromImage(bmp)
'In der Funktion Draw werden nur g.drawrectangle etc ausgefüht, sonst nichts
'PictureBox1 wird nur weitergegeben, da die Picturebox auf Sizemode=stretch steht
                Objekte.Draw(g, bmp, PictureBox1)
            End Using

            test = False
        End If
    End Sub

Woran liegt es nun, dass das Rechteck nach 2 mal Klicken auf den button mit folgendem Code:
Code:
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        test = True
        PictureBox1.Invalidate()
    End Sub

um 10 Pixel nach unten verschoben wird, das vorherige Rechteck aber weiter besteht. Bei jedem weiteren Klick verschiebt sich das Rechteck um weitere 10 Pixel, hinterlässt jedoch an jeder Position eine Kopie des Rechteckes.


Gruß David
 
was passiert in der Methode?
Code:
Objekte.Draw(g, bmp, PictureBox1)

Ich denke mal es liegt einfach da dran da du fest auf das Bitmap zeichnest (g.Flush).
Müsstest als
Code:
g.Clear...
aufrufen und deine ganzen gültigen Zeichenoperationen nochmals durchlaufen.
 
In der Funktion werden nur Aufrufe wie der hier getätigt. Die Funktion wäre zu kompliziert zu verstehen.
Code:
g.FillEllipse(Farbe, New Rectangle(X, Y, W, H))

Ansonsten ändere ich nichts an dem Bild. Was soll ich in dem Quelltext aus meinem letzten Beitrag mit g.Clear ändern?

Edit:
Wenn ich beim Button-Klick g.Clear ausführe, und der Hintergrund weiß wird, kann ich anschließend das Rechteck wie gewünscht verschieben. Leider ist das Hintergrundbild dann weg. Außerdem fürchte ich, dass es zu lange dauert, wenn das Bild jedes Mal neu geladen werden muss. Kann ich nicht einen Overlay auf dem Bild erzeugen, welchen ich wieder entfernen kann?


Gruß David
 
Zuletzt bearbeitet:
Habs jetzt wie folge erledigt. Der Vorgang dauert bei einem 5MPix Bild ca. 80ms, das ist in Ordnung:
Code:
            Using g As Graphics = Graphics.FromImage(bmp)
                g.DrawImage(bmp1, 0, 0)
                Objekte.Draw(g, bmp, PictureBox1)
            End Using
            PictureBox1.Invalidate()
bmp1 enthält das ursprüngliche Bild. Somit wird das alte Bild einfach überschrieben. Anschließend werden die Objekte gezeichnet, und fertig ist es.
Falls jemand eine bessere Idee hat, immer gerne ;)


Gruß David
 
MouseMove Event auswerten und solange Maus gedrückt wird das Rechteck im Paint Ereignis zeichen.
Wird Maus losgelassen das Rechteck fest ins Bild zeichnen.
 
Was mich halt nur irritiert ist, das du ein neues Graphics Objekt im Paint Ereignis anforderst:
Code:
Using g As Graphics = Graphics.FromImage(bmp)
Warum greifst du nicht direkt auf das Graphics Object aus dem PaintEventArgs zu?
 
Das war wohl ein Fehler.
Jetzt zeichne ich bei jedem Paint Event alle Objekte neu, dann klappts ebenfalls. Ich war mir nur nicht sicher, was mehr Rechenaufwand kostet, das Bild neu laden oder bei jedem Paint Event neu zu zeichnen. Da bei mir später bewegte Bilder ins Spiel kommen sollen, wird deine Methode sicherlich die bessere sein.
Danke für den Tip ;)

Noch eine weitere Frage: Ist es möglich, diese Formen, die ich in e.Graphics zeichne, auch transparent zu erzeugen? Bei den Windows Forms gibt es die Möglichkeit Opacity auf 0.5 oÄ. zu setzen.
Ist es dann nicht auch möglich, meine gezeichneten Formen transparent zu machen? Das wäre ziehmlich wichtig, auch wenn es etwas mehr Aufwand bedarf.

Danke!

Gruß David
 
Habe ein ähnliches Projekt gemacht...einfach um mich da etwas einzufinden, aber ohne das die Bilder später auf den Hintergrund gezeichnet werden...da ich mal mit Listen arbeiten wollte...naja da ist schonmal so eine "Schablone" bei..einfach mal anschauen :)

Die PDF ist halt der Code und in der Zip Datei liegt das Programm selbst...
 

Anhänge

Nettes Prog hast du dir gemacht ;)
Meins ist auch so in der Art, hätte ich Deins früher gehabt hätte ich nich so viel Arbeit mit meinem gehabt :P

Gruß David
 
Zurück