Abfrage, welche PictureBox geklickt wurde

Kannst du mir in etwas sagen, wie man dies realisiert?
Ich verstehe nicht ganz, ob du ein Bild für den gesamten Hintergrund meinst oder für jede PictureBox extra ein Bild in den Hintergrund. Ist der Ansatz dem Panel also sozusagen falsch? Dachte ich mir schon, dass es hierbei bessere Möglichkeiten geben muss.

Danke. Rockstady11
 
Den Hintergrund für jede PictureBox.
Beim Paint Ereignis bekommst du ein PaintEventArgs.
Dieses besitzt eine Eigenschaft Graphics, das ist das Objekt mit dem du zeichnen kannst.

Das Graphics Object, besitzt nun zum Beispiel eine Eigenschaft VisibleRectangle mit dem du die größe des akt. Sichtbaren Bereiches der PictureBox bekommst (für dich im ersten Schritt unwichtig, nur später für Performance dann).

Und das Graphics Objekt besitzt diverse Methoden zum zeichnen, z.B.: DrawImage zum zeichnen eines Bildes.
Die Methode DrawImage selbst besitzt einige Überladungen um ein ganzes Bild zu zeichnen oder nur Teile eines Bildes, welcher Farbwert Transparent ist etc.

Nachtrag:
Ich sag mal, besser ist relativ.
Aber anders würde mir jetzt nicht einfallen wie man sonst das Transparenz Problem lösen könnte.
 
Zuletzt bearbeitet:
Vielen Dank mal für die Erklärung, ich habe es zwar noch nicht geschaft dies irgendwie umzusetzen, aber vorerst ist dies nicht der springende Punkt.

Ich habe meinen Editor / Game soweit fertig, allerdings stört es mich, dass die Bilder solange brauchen, bis sie geladen werden bzw. ich denke es liegt an den Bildern.

Zunächst mal zur Erklärung, also ich habe ein Array im Hintergrund und dies wird dann auf die Zeichen hin überprüft und dann soll des entsprechende Bild geladen werden.
Code hierfür sieht so aus:

Code:
        Dim g As Integer

        'ZU ÜBERARBEITEN
        For hoehe = 0 To (hoch) - 1
            For breite = 0 To (breit) - 1

                Wert = Spielfeld(hoehe, breite)

                For g = 0 To ListBox_Zeichen.Items.Count - 1

                    If Wert = ListBox_Zeichen.Items(g) Then
                        Bilder(hoehe * breit + breite).ImageLocation = sAppPath & "\Grafiken\" & ListBox_Pfad.Items(g)
                        g = ListBox_Zeichen.Items.Count - 1
                    End If

                Next

            Next
        Next

Der Code hierfür ist nicht optimal, da, wenn z.B. Feld1 Gras beinhaltet und diese Grafik bereits geladen wurde, wird für Feld2 auch wenn dies ebenfalls Gras ist, erneut alles durchsucht, um das Zeichen zu finden, welches er "normalerweise" schon kennt.
Wenn ich aber jetzt am Ende des ganzen eine MessageBox aufploppen lasse, dann erscheint diese eigentlich sofort nach Spielstart, aber die ganzen Grafiken sind noch nicht geladen, da erscheint dann dieses Standard-Grafik-Symbol und so nach ca. 20 Sekunden sind alle Grafiken dargestellt.

Wie kann ich dies nun verbessern? Die Grafiken werden bei mir direkt von der Festplatte geladen. Diese möchte ich nicht praktisch in das Projekt reinkopieren, da man dynamisch selbst Grafiken erweitern können sollte.
Hat jemand hierfür vielleicht eine Idee? Ich wäre sehr sehr sehr dankbar.

Mit freundlichen Grüßen

Rockstady11
 
Wie was für ein Zeichen wird gesucht?
Im Prinzip brauchst du doch nur ein Dictionary zu halten mit den Bildern die schon geladen wurden.
Key wäre in diesem Fall dein Zeichen.
Dann wird zuerst das Dictionary geprüft, ist das Bild noch nicht drin wirds dem Dictionary hinzugefügt.

Und dann zum 'ZU ÜBERARBEITEN
Probier mal 'TODO: ZU ÜBERARBEITEN.
Es gibt ein Task List Fenster (hoffe so hieß es und hoffe ist in Express schon dabei).
Dies zeigt dir alle User Task (wo TODO steht) aller offenen Quellcodes in einer Liste an.
Dann siehst wenigstens ungefähr auf einen Blick was noch zu tun ist ;)
 
Also aus Spielfeld(breite, hoehe) wird ein Char an Wert übergeben, dieser Char wird in der ListBox_Zeichen gesucht, danach wird der zugehörige Pfad aus der anderen ListBox an die ImageLocation der PictureBox übergeben.

Dies dauert allerdings ziemlich lange, wie optimiere ich dies sinnvoll?
 
Dies dauert allerdings ziemlich lange, wie optimiere ich dies sinnvoll?

Über das oben genannte Dictionary.
Ungefähr so:
C#:
Dictionary<string, Image> bilderCache = new Dictionary<string, Image>();

//Kümmert sich um das Cachen und Laden der Bilder
public Image GetImage(string zeichen)
{
   Image img;
   if(bilderCache.TryGetValue(zeichen, out img) == false) //prüfen ob Bild schon geladen wurde
   {
        img = new Bitmap(sAppPath + @"\Grafiken\" + zeichen); //Bild laden
        bilderCache.Add(zeichen, img); //dem cache hinzufügen
   }
   return img;
}
C#:
Bilder[hoehe * breit + breite].Image = GetImage(ListBox_Zeichen.Items[g].ToString());
(Nicht getestet!)
 
Zuletzt bearbeitet von einem Moderator:
Spyke, du bist mein Mann! :)

Ich danke dir vielmals, es hat so wunderbar funktioniert und die Ladefunktion ist enorm verbessert
Ein Platz in meinen Credits des Games ist dir sicher, sende mir kurz eine PM oder so wie du dort erwähnt werden möchtest.
Nochmals vielen Dank, hat mir extrem geholfen!

MfG Rockstady
 
Hi zusammen

ich habe heute ein neues Problem entdeckt, vielleicht könnt ihr hierbei nochmals helfen. Also mein Code:
Code:
Bilder(hoehe * breit + breite).ImageLocation = (sAppPath & "\Grafiken\" & ListBox_Pfad.Items(g))
Bilder(hoehe * breit + breite).Image = GetImage(ListBox_Zeichen.Items(g).ToString, g))

Die ImageLocation brauche ich leider, da hierauf dann später bestimmte Abfragen basieren, um herauszufinden, welches Bild sozusagen in der PictrureBox ist. Problem ist nun, dass des mit dem "GetImage" von Spyke super und schnell funktioniert, aber kurze Zeit später erst das mit der ImageLocation geladen ist. Wenn man also in dieser Zwischenzeit bereits etwas an der Map verändert, wird danach durch die ImageLocation alles wieder überschrieben.
Habt ihr eine Ahnung, wie ich die ImageLocation sozusagen zuweisen kann, aber das Bild nicht laden lassen kann?

Mfg
Bloodhero
 
Schau mal nach es müsste eine Eigenschaft Tag geben, der könntest du den Pfad übergeben.
Und damit später abprüfen.

Alternativ könntest du dir auch ein 2tes Array halten welches einfach nur den Zustand der PictureBox repräsentiert.

Oder du schaust dir OOP mal an ;)

Aufjedenfall ImageLocation raus.
 
Zurück