Flackern im Hintergrund

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von Luca.

    Flackern im Hintergrund

    Hi,
    ich suche schon seit Tagen nach einer Lösung auf Google und in diesem Forum, aber finde nichts :( .
    Ich hab ein Programm gemacht was so kleine verschiebbare Fenster hat. Es geht alles aber wenn ich einen Hintergrund einfüge, flackert alles beim verschieben. Mit GDI+ flackert es noch mehr ?( . Bei Bildern mit kleinerer Auflösung flackert es etwas weniger, aber ich hätte gerne ein 1080p Bild. Ich habe den Code in ein kleinen Test Programm geschrieben und ihn in den Anhang gelegt :D .

    Ich hoffe ihr könnt mir helfen...
    MfG Luca :)

    EDIT: Test ist beim letzten Beitrag :D

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Luca“ ()

    Setze mal die DoubleBuffered-Eigenschaft auf true.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Trade“ ()

    DoubleBufferd ist in den Einstellungen von frmMain auf true, aber nutzt relativ wenig ?!!?
    Ich hab mal gelesen, dass Me.SuspendLayout() etwas bringen soll, tut es aber bei mir auch nicht :(

    sothere schrieb:

    Ich konnte den Fehler nur zur Hälfte reproduzieren:
    Nur wenn der Hintergrund neu gezeichnet wird flackert es bei mir, ansonsten haut alles hin beim verschieben.


    Ja das meine ich :D

    Ich hab noch einen Fehler gefunden, wenn man ein Fenster zu lange bewegt, kommt eine Meldung: Zu wenig Arbeitsspeicher ;( Das kann eigentlich auch nicht sein.

    An der Grafikkarte kann es nicht liegen, hab gerade eine neue ^^

    EDIT: bin überfordert. Ich wollte noch einmal mir das RAM Problem ansehen, aber das tauchte nicht mehr auf. Ich hab nichts verändert.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Luca“ ()

    Also im Paint Event ?

    VB.NET-Quellcode

    1. Private Sub frmMain_Paint(sender As Object, e As PaintEventArgs) Handles Me.Paint
    2. Me.DoubleBuffered = True
    3. If PaintBackground = True Then
    4. e.Graphics.DrawImage(Image.FromFile("Wallpaper.png"), New Point(0, 0))
    5. Me.BackgroundImage = Nothing
    6. End If
    7. End Sub


    Das bringt aus irgendeinem Grund auch nichts. ?(

    EDIT: Hab noch mal alles ins Projekt übernommen:
    Dateien
    • Test.zip

      (112,15 kB, 116 mal heruntergeladen, zuletzt: )

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Luca“ ()

    naja, willst du das Bild nur als Hintergrund oder willst du es selber zeichnen?
    Denn wenn du das Bild als Hintergrund nehmen willst, dann kannst du doch einfach das BackgroundImage des Forms nehmen.
    Ansonsten bleibt wohl das Flackern, da GDI - wie gesagt - nicht gerade das Performateste ist.
    Liebe Grüße
    sothere
    Okay, wie mache ich das ? :D

    Ich hab ein Vollbild-Button hinzugefügt und Wallpaper.png mit 1080p neu gemacht, dabei ist das Problem mit Zu wenig RAM wieder aufgetaucht. Kann es sein, dass das auch wegen den zu oft neu Laden kommen könnte ?( ?
    Dateien
    • Test.zip

      (6,17 MB, 112 mal heruntergeladen, zuletzt: )

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Luca“ ()

    VB.NET-Quellcode

    1. Private Sub frmMain_Load(sender As Object, e As EventArgs) Handles Me.Load
    2. Add("Test", 500, 350)
    3. Me.BackgroundImage = Image.FromFile("Wallpaper.png")
    4. Me.SuspendLayout()
    5. End Sub
    6. Private Sub frmMain_Paint(sender As Object, e As PaintEventArgs) Handles Me.Paint
    7. Me.DoubleBuffered = True
    8. 'If PaintBackground = True Then
    9. ' e.Graphics.DrawImage(Image.FromFile("Wallpaper.png"), New Point(0, 0))
    10. ' Me.BackgroundImage = Nothing
    11. 'End If
    12. End Sub


    So ? Das geht irgendwie nicht :S . Es flackert bei mir genauso, aber das RAM-Problem ist weg :D Danke.
    Nein! ThuCommix meint es so, du sollst eine Globale Variable setzen, beim Form_Load-Event sollst du das Bild dann laden und im Paint-Event das geladene Bild verwenden!

    So ungefähr..

    VB.NET-Quellcode

    1. Dim img As Image
    2. Private Sub frmMain_Load(sender As Object, e As EventArgs) Handles Me.Load
    3. Add("Test", 500, 350)
    4. img = Image.FromFile("Wallpaper.png")
    5. Me.SuspendLayout()
    6. End Sub
    7. Private Sub frmMain_Paint(sender As Object, e As PaintEventArgs) Handles Me.Paint
    8. Me.DoubleBuffered = True
    9. If PaintBackground = True Then
    10. e.Graphics.DrawImage(img, New Point(0, 0))
    11. End If
    12. End Sub
    DANKE an alle die mir geholfen haben :D ich hab eine Lösung entdeckt:

    VB.NET-Quellcode

    1. Imports System.Reflection
    2. Imports System.Runtime.CompilerServices
    3. Module DoubleBuffered
    4. <Extension()> _
    5. Public Sub SetDoubleBuffered([Control] As Control)
    6. [Control].GetType().InvokeMember("DoubleBuffered", BindingFlags.SetProperty Or _
    7. BindingFlags.Instance Or BindingFlags.NonPublic, Nothing, [Control], New Object() {True})
    8. End Sub
    9. End Module


    csharp-examples.net/set-doublebuffered
    FlowLayoutPanel flackert

    Dateien
    • DoubleBuffered.vb

      (383 Byte, 96 mal heruntergeladen, zuletzt: )
    • Test.zip

      (6,24 MB, 117 mal heruntergeladen, zuletzt: )

    Dieser Beitrag wurde bereits 8 mal editiert, zuletzt von „Luca“ ()