PictureBox (Teilbereiche kopieren & Einfügen)

Pat-NRW

Grünschnabel
Hallo Forum-Gemeinde
Neu angemeldet und gleich eine Frage weil meine Programmiererfahrung zu lange her ist (VB5Pro & C++ auf Amiga).
Will jetzt aber wieder einsteigen mit VB 2008 Express da es ja preislich nicht günstiger geht :D Meine alten Sourcecodes liegen
leider auf einem alten Zip-Drive und mangels Hardware komm ich da nicht mehr dran. Portieren ging wahrscheinlich eh nicht.
Zur Zeit probiere ich mit Erfolg alles durch was ich so brauchen werde. Aber eine Sache bereitet mir Kopfschmerzen und unruhige
Nächte.

Zielbeispiel:
Zwei PictureBoxen. Eine soll zb. das Spielfeld (A) sein, eine weiter, unsichtbare Box (B), beinhaltet verschiedene Spielsteine
die bei Bedarf als Teilausschnitt in das Spielfeld eingefügt werden soll. Hierbei soll auch nur eine Teilbereich überschrieben werden.
Also ...... einen Stein von (B) z.b. 30x30 Pixel nach (A) bringen ohne das der Rest von (A) überschrieben wird.

GDI32 ist so weit klar und BitBlt eigentlich auch. Eigentlich deshalb weil ein ergoogelte Beschreibung zwar das gesetzte Ziel erreicht aber
der Rest von der Box ebenfalls überschrieben bzw. gelöscht wird. Und genau das soll nicht passieren.

Würde mich freuen wenn Vorschläge oder Tips eingehen ....... sonst bekomme ich noch mehr graue Haare :-(

LG Pat
 
Also erstmal würde ich als "Grafikspeicher" keine unsichtbare PictureBox nehmen, sondern eine oder mehrere Bitmaps.
Zweitens: BitBlt brauchst du nicht. GDI+ ist im .Net-Framework vollständig unterstützt.
Hier ein Beispielcode, der ein transparentes PNG von der Festplatte ließt (Form-Load-Event), in einer Bitmap zwischenspeichert und einen Ausschnitt davon auf eine "PictureBox1" zeichnet (Paint-Event der PictureBox1):
Code:
Public Class Form1
    Private bild As Bitmap

    Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
        Dim Quellbereich As New Rectangle(100, 100, 50, 50) ' Gibt an welche Pixel gezeichnet werden sollen
        Dim Zielbereich As New Rectangle(10, 10, 50, 50) ' Gibt an auf welchen Bereich die Pixel gezeichnet werden sollen. Man beachte, dass die Pixel hierbei auf die größe des Zielbereichs gestreckt werden, falls Quellbereich und Zielbereich nicht gleich groß sind!
        e.Graphics.DrawImage(bild, Zielbereich, Quellbereich, GraphicsUnit.Pixel)
    End Sub

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        bild = New Bitmap("C:\MeinBildDasSogarTransparentSeinDarf.png")
    End Sub
End Class
 
Danke Schakie
Jetzt muß noch nur noch sehen wie ich es auf meine Bedürfnisse umbasteln kann. Auf jeden Fall geht es erst einmal.

Das mit den Bitmaps statt Box ging mir Abends auch noch durch den Kopf ..... recht haste ;)
GDI+ .... wieder schlauer geworden. Wie gesagt ist seeeehr lange her das in VB was gemacht habe.

LG Pat
 
Mhhhhhh ... so ganz klappt das doch nicht. Will ich per Button die kleine Bitmap mehrfach, je Klick eine mit geänderten XY-Positionen,
in der Box anzeigen lassen verschwinden die anderen wieder. Da wird also nix zu gefügt. Das einzige was bleibt ist das BackgroundImage.

Muss ich noch mal drüber schlafen ........

LG Pat
 
Die PictureBox hat, im Gegensatz zu VB6 und früher (glaube ich jedenfalls), keinen DoubleBuffer. Das heißt Dinge, die du zeichnest, merkt sich die PictureBox nicht.
Das Zeichnen solltest du immer im Paint-Event ausführen und du musst das Bild so zeichnen, wie es angezeigt werden soll. Also nicht nur Veränderungen gegenüber dem letzten Button-Click oder Ähnlichem zeichnen.
Klar?
Schau dir mal dieses Tutorial an. Ist in C# aber zum Übersetzen nach VB.Net kannst du einfach einen CodeTranslator verwenden.
 
Zuletzt bearbeitet:
Danke Dir Shakie
Bin jetzt auch so weit ..... aber das ich davon begeistert bin immer wieder den kompletten Aufbau
per Bitmap zu benutzen wäre gelogen :( Ich muß mir dazu noch ein paar Gedanken machen.
Gibt es denn überhaupt keine Möglichkeit wie früher einzelne Grafikelemente dauerhaft in eine
PictureBox oder auch nur in eine Form oder sonst was einzubinden?

LG Pat
 
Zurück