Laden...

BackgroundImage + BackgroundImageLayout = Stottern des Programms

Erstellt von Gh0st21 vor 9 Jahren Letzter Beitrag vor 9 Jahren 3.443 Views
G
Gh0st21 Themenstarter:in
26 Beiträge seit 2014
vor 9 Jahren
BackgroundImage + BackgroundImageLayout = Stottern des Programms

Hallo Leute 😃

Tut mir leid für den etwas vielleicht nicht völlig verständlichen Titel aber weiß nicht wie ich das Problem anders betiteln soll 😒

Es geht darum, dass sobald ich in den Eigenschaften für meine Form ein Bild als Hintergrund anlege und das Bild der Form anpasse flattert mein Programm beim debuggen/Ausführen.

Weiß jemand ein Ansatz wieso es so Flattern kann? oder noch besser wie ich das unterbeinden kann?
Sobald kein Hintergrundbild festgelegt ist Funktioniert es wieder ohne flattern. Für mich ein Ratloses Problem.

5.657 Beiträge seit 2006
vor 9 Jahren

Hi Gh0st21,

ein paar mehr Infos wären nicht schlecht: Wie groß ist das Bild? Wie legst du das Hintergrundbild fest? Verwendest du WinForms oder WPF? Versetze dich mal in die Lage derjenigen, die dir helfen wollen.

Christian

Weeks of programming can save you hours of planning

G
Gh0st21 Themenstarter:in
26 Beiträge seit 2014
vor 9 Jahren

MrSparkle : Ok, tut mir leid. Hier mal ein paar mehr Information.
Ich verwende WinForms - Das Bild ist 1600 x 1200 pixel, 1,15mb und das Bild lege ich über das Eigenschafts-Fensters fest also lade es nicht direkt im Code hoch
PS: Ich nutzte das Visual Studio 2013

5.657 Beiträge seit 2006
vor 9 Jahren

Wenn das alle Infos sind, die du uns geben kannst, kann ich nur sagen: Bei mir funktioniert das.

Kannst du denn bestätigen, daß ein anderes (kleineres) Bild auch ruckelt? Was passiert, wenn du das Bild in einer PictureBox verwendest? Hast du schon [Tutorial] Zeichnen in Windows-Forms-Programmen (Paint/OnPaint, PictureBox) ausprobiert? Wird das Bild skaliert und wenn ja, was passiert, wenn die Skalierung nicht verwendet wird? Was hast du sonst alles ausprobiert?

Christian

Weeks of programming can save you hours of planning

Gelöschter Account
vor 9 Jahren

Flickern tritt durch sehr kurze Invalidate Intervalle auf also wenn das ContainerControl permanent neugezeichnet wird. Ich gehe mal davon aus da liegen noch Controls auf der Form die entweder (timerbasiert) bewegt werden oder von sich aus ein permanentes neuzeichnen auslösen.

Mittels "C# Flicker Free BackgroundImage" und einer sogenannten Suchmaschine(eine Erfindung aus Amerika) findet man jede Menge Lösungen auf dem Silbertablett serviert.

Sowas zum Beispiel:

Dont Flicker ! Double Buffer !

16.806 Beiträge seit 2008
vor 9 Jahren

Die Erfinder der Suchmaschine sind Kanadier, keine Amerikaner (was hier wohl implizit die USA suggeriert); FYI.

G
Gh0st21 Themenstarter:in
26 Beiträge seit 2014
vor 9 Jahren

Ja allerdings wird das Bild ja nicht erst neu erstellt sondern ist von anfang an fest gelegt.
(oder ich verstehe dich falsch) 😕

So lege ich mein HintergrundBild fest.

this.BackgroundImage = Warenwirtschafts_System.Properties.Resources.Hintergrund;

Was ich noch eingeführt habe ist, sobald man mit dem Maus über die Buttons geht, sich der Hintergrundbild auch verändert unzwar so

Festlegen, welcher Button welches Hintergrundbild haben soll.



public WWS()
        {
            InitializeComponent();
this.BackgroundImage = Warenwirtschafts_System.Properties.Resources.Hintergrund;
 
            this.btnRechnung.BackgroundImage = Warenwirtschafts_System.Properties.Resources.btnR;
            this.btnKasse.BackgroundImage = Warenwirtschafts_System.Properties.Resources.btnK;
            this.btnKontakt.BackgroundImage = Warenwirtschafts_System.Properties.Resources.btnKon;

}

& so verändere ich den Hintergrundbild


private void showHover(object sender, EventArgs e)
        {
            // Wenn Maus über Button Rechnung ist
            if(sender == btnRechnung)
            { this.btnRechnung.BackgroundImage = Warenwirtschafts_System.Properties.Resources.header; } 
            
            // Wenn maus über Button kasse ist
            else if(sender == btnKasse)
            { this.btnKasse.BackgroundImage = Warenwirtschafts_System.Properties.Resources.header; }
            
            // Wenn maus über Button Kontakt ist
            else if(sender == btnKontakt)
            { this.btnKontakt.BackgroundImage = Warenwirtschafts_System.Properties.Resources.header; }

        }

und sobald die Maus den Button verlässt setzte ich das Bild wieder zurück

        private void showLeave(object sender, EventArgs e)
        {
            
            if (sender == btnRechnung)
            { buttonBack(sender); }

            else if (sender == btnKasse)
            { buttonBack(sender); }

            else if (sender == btnKontakt)
            { buttonBack(sender); }

        }

        private void buttonBack(object s)
        {

            this.btnRechnung.BackgroundImage = Warenwirtschafts_System.Properties.Resources.btnR;
            this.btnKasse.BackgroundImage = Warenwirtschafts_System.Properties.Resources.btnK;
            this.btnKontakt.BackgroundImage = Warenwirtschafts_System.Properties.Resources.btnKon;

        }

Funktioniert zwar auch, aber es dauert ca 1 Sekunde, bis sich das Hintergrundbild verändert wen man mit der Maus drüber geht, sobald man allerdings mit der Maus den Button verlässt nimmt es ohne verzögerung den alten Hintergrundbild wieder an.

5.657 Beiträge seit 2006
vor 9 Jahren

Hi Gh0st21,

das sieht mir nach der denkbar schlechtesten Umsetzung deiner Anforderungen aus. Warum verwendest du nicht einen Style mit einem Trigger, um das Hintergrundbild bei einem MouseOver zu verändern?

Das alles geht komplett ohne Code-Behind.

Christian

Weeks of programming can save you hours of planning