tutorials.de Buch-Aktion 02/2012
ERLEDIGT
NEIN
ANTWORTEN
7
ZUGRIFFE
1245
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    i123 i123 ist offline Mitglied
    Registriert seit
    Nov 2009
    Beiträge
    22
    Guten Tag,
    habe mal wieder ein kleines Problem mit meinem neuem Projekt und da mir hier immer bestens geholfen wird, hoff ich mal das der Thread auch im richtigem Bereich ist.

    Habe in meinem Projekt alle Knöpfe / Buttons mit MouseHover versehen, doch wenn man drübergeht, dann braucht er immer 1 sek, oder so bis er das geladen hat ? Stört zwar nicht so sehr, aber würde das trotzdem gerne weghaben...

    Die Grafiken sind schon klein, um die 3-4 KB von Photoshop fürs Web konvertiert, und sie sind auch alle im Resources Ordner, also wieso muss er die Grafiken immer wieder neu laden?

    Kann man das irgendwie verhindern?

    mfg
     

  2. #2
    Avatar von Nico Graichen
    Nico Graichen Nico Graichen ist offline aka gemballa
    tutorials.de Moderator
    Registriert seit
    Dec 2003
    Ort
    Pulheim (NRW)
    Beiträge
    3.883
    Blog-Einträge
    34
    Hi

    Post doch mal den Code, der dann ausgeführt wird! So lässt sich dazu nicht viel sagen
     
    Grüße Nico
    ----------------------
    Xing
    ----------------------
    Zitat Zitat von Mark Twain (1835-1910)
    Es gibt drei Dinge, die eine Frau aus dem Nichts hervorzaubern kann: einen Hut, einen Salat und einen Ehekrach.
    Zitat Zitat von Mike Wilson - Biographie über Larry Ellison (CEO Oracle)
    The Difference Between God and Larry Ellison: God Doesn't Think He's Larry Ellison

  3. #3
    i123 i123 ist offline Mitglied
    Registriert seit
    Nov 2009
    Beiträge
    22
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
            private void einzelspieler_MouseHover(object sender, EventArgs e)
            {
                einzelspieler.BackgroundImage = Carcassonne.Properties.Resources.einzelspieler;
                this.Cursor = Cursors.Hand;
                erklaerung.Text = "Spiel gegen den Computer";
            }
     
            private void einzelspieler_MouseLeave(object sender, EventArgs e)
            {
                einzelspieler.BackgroundImage = Carcassonne.Properties.Resources.einzelspielerohne;
                this.Cursor = Cursors.Default;
                erklaerung.Text = "";
            }

    So mache ich das, das mit dem Text ist nun nicht überall, aber die ersten beiden ansich schon...
     

  4. #4
    Avatar von Nico Graichen
    Nico Graichen Nico Graichen ist offline aka gemballa
    tutorials.de Moderator
    Registriert seit
    Dec 2003
    Ort
    Pulheim (NRW)
    Beiträge
    3.883
    Blog-Einträge
    34
    Hi

    Das Code wird permanent bei jeder Bewegung der Maus über dem Control ausgeführt.
    Probier mal, ob das Problem im MouseEnter-Event auch auftritt
     
    Grüße Nico
    ----------------------
    Xing
    ----------------------
    Zitat Zitat von Mark Twain (1835-1910)
    Es gibt drei Dinge, die eine Frau aus dem Nichts hervorzaubern kann: einen Hut, einen Salat und einen Ehekrach.
    Zitat Zitat von Mike Wilson - Biographie über Larry Ellison (CEO Oracle)
    The Difference Between God and Larry Ellison: God Doesn't Think He's Larry Ellison

  5. #5
    Avatar von Danielku15
    Danielku15 Danielku15 ist offline Mitglied Platin
    Registriert seit
    Feb 2004
    Ort
    Österreich
    Beiträge
    731
    Blog-Einträge
    3
    Hallo.
    Ich kann Nico nur zustimmen. Das Problem wird daran liegen dass beim MouseHover Event das Control oft neu gezeichnet wird. Am besten auf das MouseEnter Event umändern oder eine zusätzliche Bedingung einbauen ob sich das Hintergrundbild ändern soll. Bspw einen Spezialwert im Tag-Property ablegen und auf diesen Prüfen
    Code csharp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    private void einzelspieler_MouseHover(object sender, EventArgs e)
    {
        if(einzelspieler.Tag != "MouseOver")
        {    
            einzelspieler.BackgroundImage = Carcassonne.Properties.Resources.einzelspieler;
            this.Cursor = Cursors.Hand;
            erklaerung.Text = "Spiel gegen den Computer";
        }
    }
     
    private void einzelspieler_MouseLeave(object sender, EventArgs e)
    {
        if(einzelspieler.Tag != "MouseLeave")
        {
            einzelspieler.BackgroundImage = Carcassonne.Properties.Resources.einzelspielerohne;
            this.Cursor = Cursors.Default;
            erklaerung.Text = "";
        }
    }

    Zum generellen Thema "Geschwindigkeit beim Laden von Resourcen":
    Das Laden von Resourcen ist oft mal aufwändiger als gedacht. Ich hatte bei meinem aktuellen Projekt ein ähnliches Problem. (Visualisierung von Noten auf einem Griffbrett). Ich zeichne oft innerhalb von Bruchteilen von Sekunden das Control neu und hatte auch in der Zeichenroutine das Hintergrundbild über die Resources Klasse angegeben. ich musste feststellen dass die Resource oft neu geladen werden muss was enormen Ladeaufwand zur Folge hatte. Um dem Problem Abhilfe zu schaffen lade ich zu Beginn das Bild einmal in eine statische Variable (lazy-loaded-property). Das erhöht zwar den benötigten Speicher des Programms, verringert aber den Aufwand die Ressource jedes mal neu zu laden. Aussehen tut das Ganze ungefähr so:

    Code csharp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    private Image _backgroundImage = null;
    private Image BackgroundImage {
        get {
            if(_backgroundImage == null) {
                _backgroundImage = Resouces.FretboardBackground;
            }
            return _backgroundImage;
        }   
    }
     
    private void PaintFretboard(Graphics g)
    {
        g.DrawImage(_backgroundImage,...);
    }
     

  6. #6
    i123 i123 ist offline Mitglied
    Registriert seit
    Nov 2009
    Beiträge
    22
    Ok, vielen dank, das hat soweit geklappt... liegt also daran dass alles zu oft repaintet wird nehme ich an...
    Jetzt hab ich allerdings noch das selbe problem bei meiner eigentlichen spielfläche:
    Das spiel ist eine art puzzlespiel.
    Jedes Puzzleteil wird durch eine Picturebox dargestellt.
    Um dem Spieler zu zeigen wo er sein aktuelles Puzzleteil anlegen könnte werden PictureBoxen dorthingelegt wo ein teil sein könnte.
    d.h. nach jedem spielzug werden diese temorären markierungen wieder gelöscht und neue erstellt -> massig repaints durch das löschen und hinzufügen von pictureboxen...

    Jetzt meine Frage:
    Kann ich unterdrücken dass meine form ständig repaintet wird und sie erst manuell repainten wenn alles fertig berechnet ist?
     

  7. #7
    i123 i123 ist offline Mitglied
    Registriert seit
    Nov 2009
    Beiträge
    22
    niemand eine Idee?
     

  8. #8
    Avatar von Spyke
    Spyke Spyke ist offline Capoeirista
    Registriert seit
    Oct 2002
    Beiträge
    931
    Ich würde ohne Pictureboxen arbeiten und alles selbst zeichnen.
    Die Koordinaten kannst du dir in einer eigenen Rectangle Auflistung merken und über das Graphics Objekt kannst du ja Bilder anzeigen lassen.
    Bringt auch weniger Performance probleme (bei größerer Anzahl an Pictureboxen).

    Zusatzinfo: Rectanlge besitzt eine Contains Methode mit der du Prüfen kannst ob ein Punkt innerhalb des Rectangles sich befindet.

    Musst also nur in deinem Steuerelement welches für das Zeichnen zuständig ist OnPaint überschreiben und die jeweiligen Maus Ereignisse.
     
    www.iv-interactive.de - Projektewebsite
    WikiParser - aktuelles Projekt

Ähnliche Themen

  1. Grafiken laden
    Von Len-ni im Forum C/C++
    Antworten: 5
    Letzter Beitrag: 16.01.08, 19:30
  2. Rahmen um links(Grafiken) trotz css.
    Von geckoline im Forum CSS
    Antworten: 2
    Letzter Beitrag: 14.10.05, 22:46
  3. Grafiken aus Cache laden....
    Von bernhardp im Forum HTML & XHTML
    Antworten: 1
    Letzter Beitrag: 21.06.05, 11:12
  4. Grafiken im Hintergrund laden
    Von NoGi im Forum HTML & XHTML
    Antworten: 1
    Letzter Beitrag: 23.04.03, 11:44
  5. Bei mouse over 2 Grafiken laden...
    Von Oxygen im Forum Javascript & Ajax
    Antworten: 13
    Letzter Beitrag: 26.02.02, 13:55