Anfängerfrage: Auf eine PictureBox zeichnen? Wie?

u918244

Grünschnabel
Hallo Forum,

vorsicht, hier kommt eine Anfängerfrage. Vielleicht könnt Ihr mir ja helfen. Ich benutze VB.Net 2008 und habe im Groben vor, ein Programm zu schreiben, das:
1. in der Form eine PictureBox enthält
2. in die PictureBox ein Bild lädt (als Hintergrundbild)
3. auf dieses Bild an Koordinaten, die aus einer Datei eingelesen werden, kleine Quadrate zeichnet
4. die fertige Grafik abspeichern kann, ohne die Vorlagedatei zu überschreiben.

Dazu habe ich mein Form erstellt und eine PictureBox (BILD) nebst einem Button eingefügt. Dazu noch einige Textfelder, die nötige Parameter angeben. Diese sind aber hier nicht so wichtig.
Wenn ich das Programm starte, macht es eigentlich alles so, wie es soll, ich sehe auch kurz meine kleinen Quadrate, aber innerhalb von Sekundenbruchteilen wird das eigentlich im Hintergrund liegende Bild nach oben geholt (oder neu geladen?), so dass ich meine eingezeichneten Objekte nicht mehr sehe.
Hier der grobe Code:
PHP:
Private Sub btn_color_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_color.Click
        Dim myGraphics As Graphics
        Dim input As String = ""
        Dim outputx(5000) As Integer
        Dim outputy(5000) As Integer
        Dim outputz(5000) As Single
        Dim lowestdata As Single = 10000
        Dim highestdata As Single = -10000
        Dim i As Integer = 0
        Dim FStream As New FileStream(openfile(), FileMode.Open, FileAccess.Read)
        Dim sreader As New StreamReader(FStream)
        Dim maxx As Integer
        Dim maxy As Integer

        myGraphics = Graphics.FromHwnd(BILD.Handle)

        BILD.Load(txt_template.Text)

        maxx = txt_diesx.Text
        maxy = txt_diesy.Text

        Do Until sreader.Peek = -1
            input = sreader.ReadLine
            outputx(i) = Val(stringseparate(input)(0))
            outputy(i) = Val(stringseparate(input)(1))
            outputz(i) = stringseparate(input)(2)
            i += 1
        Loop

        drawskala(lowestdata, highestdata)

        For j = 0 To (i - 1)
            drawdie(outputx(j), outputy(j), maxx, maxy, wert2rgb(outputz(j))(0), wert2rgb(outputz(j))(1), wert2rgb(outputz(j))(2))
        Next
        BILD.Refresh()
    End Sub

mit maxx und maxy übergebe ich die maximale Anzahl der Positionen für meine Quadrate in X- und Y-Richtung. Damit wird dann die Größe der Quadrate errechnet, um damit die PictureBox-Fläche füllen zu können.

wert2rgb ist eine Funktion, die mir einfach ein Array mit den RGB-Werten zu meinem Messwert erzeugt. -> funktioniert auch

drawdie ist die Funktion, die meine kleinen Quadrate zeichnet:
PHP:
Sub drawdie(ByVal xcoord As Integer, ByVal ycoord As Integer, ByVal numx As Integer, ByVal numy As Integer, ByVal r As Integer, ByVal g As Integer, ByVal b As Integer)
        Dim intographics As Graphics
        Dim waferxdim, waferydim, abstand As Integer
        Dim hoehe, breite, startx, starty As Single
        intographics = Graphics.FromHwnd(BILD.Handle)
        waferxdim = 400
        waferydim = 400
        abstand = 1
        breite = (waferxdim - (numx + 1) * abstand) / numx
        hoehe = (waferydim - (numy + 1) * abstand) / numy
        startx = System.Math.Round(abstand + (xcoord * (abstand + breite)))
        starty = System.Math.Round((numy - 1 - ycoord) * (abstand + hoehe))
        intoGraphics.FillRectangle(New SolidBrush(Color.FromArgb(r, g, b)), startx, starty, breite, hoehe)
        intoGraphics.DrawRectangle(New Pen(Color.FromArgb(0, 0, 0)), startx, starty, breite, hoehe)
    End Sub

drawskala zeichnet eine Farbskala in eine andere PictureBox, klappt auch.


Könnt Ihr mir bei diesem Problem helfen?
Wahrscheinlich ist es programmiertechnisch total daneben, was ich hier gemacht habe, ich weiß es aber leider nicht besser.

Gruß,
Heiko
 
Danke schonmal für die Antwort. Ich werde es gleich mal probieren.
BILD ist wie angegeben eine PictureBox.

Gruß,
Heiko
 
Hallo Forum,

leider verhält sich das Programm wie vorher:
Ich kann, nachdem die Datendatei geladen wurde für Sekundenbruchteile die gezeichneten Rechtecke auf meiner Hintergrundgrafik sehen. Dann sehe ich wie vorher nur die Hintergrunddatei. Auch bei erneutem Aufrufen des Ladevorganges immer das gleiche Verhalten.
Ich verstehe das irgendwie nicht.
Wenn mir jemand konkret helfen mag, kann ich ihm auch den Quellcode einmal zumailen, damit die Zusammenhänge klarer werden.

Gruß,
Heiko

EDIT:
Ich habe mal probiert, die Zeile
PHP:
BILD.Load(txt_template.Text)
auszukommentieren. Et voilá: Die Rechtecke werden dargestellt und bleiben auch so. Es muss also etwas mit dem Bild, das eigentlich unter den Punkten liegen soll, zu tun haben. Aber was ?

PS: Wahrscheinlich habe ich nur wieder irgendetwas nicht begriffen, aber ich sehe da wohl den Wald vor lauter Bäumen nicht...
 
Zuletzt bearbeitet:
Da musst du wohl mehr von deinem BILD Objekt preisgeben.

Edit:
Nur damit verständlich ist.
Meine Code posten ^^
 
Ich weiß nicht, was ich da preisgeben soll. BILD ist einfach eine in die Windows Form gezeichnete PictureBox.
Die hat doch per se keinen Code, oder?
Sonst sagt mir bitte, was ich da posten soll.

Gruß,
Heiko
 
Achso
na dann ist alles klar :D

durch
Code:
BILD.Load(txt_template.Text)
wird ein neues Image Objekt angelegt

Code:
myGraphics = Graphics.FromHwnd(BILD.Handle)
greift glaube auf das Handle des Image (mit) zurück.
Kann mich hier auch sehr wahrscheinlich irren, bitte korrigiert mich dann.


Aufjedenfall wenn du die Reihenfolge änderst sollte es funktionieren
Code:
BILD.Load(txt_template.Text)
myGraphics = Graphics.FromHwnd(BILD.Handle)

Edit:
Und vielleicht sogar besser das Graphics Object über die Image Eigenschaft der PictureBox besorgen
Code:
myGraphics = Graphics.FromImage(BILD.Image)
Aber wie gesagt zuerst das Bild laden, dann das Graphics Objekt anfordern.
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück