tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
3
ZUGRIFFE
2622
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von Sunray
    Sunray Sunray ist offline Mitglied Gold
    Registriert seit
    Sep 2003
    Ort
    Schweiz
    Beiträge
    190
    Hi,
    ich bastle gerade an einem Programm, das mir verschiedene Grafiken in ein und demselben Fenster zeichnet. Was genau gezeichnet wird, hängt ganz vom Input (Konsole, XML-File usw.) ab. Daher kann ich im voraus nicht wissen, was GDI zeichnen soll.

    Damit das Fenster auch schön brav neu gezeichnet wird, malt GDI bei der Berechnung in ein Bitmap, welches dann im Paint-Ereignis der Formulars angezeigt wird.
    Wenn ich allerdings die Grösse des Fensters verändere (wobei das Bild natürlich angepasst/verzerrt wird), beginnt die Flackerei (der weisse Hintergrund wird ganz kurz sichtbar).

    Das Problem scheint zu sein, dass mein Zeichenbereich schon vor dem Paint-Ereignis gelöscht wird.
    Kennt jemand eine Möglichkeit, dies zu verhindern?

    (Ich programmiere in VB.NET für .NET 2.0)
     
    Zu jedem Problem gibt es mindestens eine Lösung.
    Zu jeder Lösung gibt es mindestens eine bessere Lösung

  2. #2
    Avatar von Norbert Eder
    Norbert Eder Norbert Eder ist offline Mitglied Diamant
    Registriert seit
    Feb 2004
    Ort
    Österreich / Graz
    Beiträge
    5.137
    Blog-Einträge
    51
    Naja, beim Resizen wird der Inhalt neu gezeichnet.

    Wirf mal den folgenden Code in den Constructor deiner Form

    Code :
    1
    2
    3
    
    SetStyle( ControlStyles.UserPaint, true );
    SetStyle( ControlStyles.AllPaintingInWmPaint, true );
    SetStyle( ControlStyles.DoubleBuffer, true );
     

  3. #3
    Avatar von Sunray
    Sunray Sunray ist offline Mitglied Gold
    Registriert seit
    Sep 2003
    Ort
    Schweiz
    Beiträge
    190
    Hat nichts geholfen..

    DoubleBuffer funktioniert aus irgend einem Grund nicht. Ich erhalte eine InvalidArgument Exception von der Application.Run Methode.

    Es soll beim Resizen ja auch neu gezeichnet werde aber erst, wenn das "Bild" angepasst wurde. Das alte Bild soll so lange sichtbar bleiben bis das neue Bild verfügbar ist.

    Gibt es irgend ein Event, das mir sagt, wann es nötig ist mein Fenster neu zu zeichnen.
    Hat das irgendwas mit "Validierung" zu tun?
     
    Zu jedem Problem gibt es mindestens eine Lösung.
    Zu jeder Lösung gibt es mindestens eine bessere Lösung

  4. #4
    Avatar von Sunray
    Sunray Sunray ist offline Mitglied Gold
    Registriert seit
    Sep 2003
    Ort
    Schweiz
    Beiträge
    190
    Ich hab die Lösung!

    Ich habe in meinem Formular einfach die onPaintBackground-Methode überschreiben, die eigentlich das PaintBackground-Ereignis auslösen würde.
    Somit wird der Hintergrund eben nicht gezeichnet, bevor das Paint-Ereignis ausgelöst wird, was mir die Möglichkeit gibt, das neuzeichnen so lange wie nötig herauszuzögern.

    Allerdings habe ich jetzt ein anderes Problem. Folgender Code generiert ab und zu eine InvalidOperationException mit der Meldung, ich würde das Formular aus einem anderen Thread heraus ändern, als es erstellt wurde. Ok, darauf war ich vorbereitet. Deswegen auch das If InvokeRequired. Und Trotzdem taucht dieser Fehler immer noch auf... SyncLock kann ich ja nicht verwenden, da ich mich dann mit einem DeadLock konfrontiert sähe...

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    If Me.InvokeRequired Then
        Me.Invoke(New Champ.Framework.voidSimpleCall(AddressOf changeResizeLevel))
        Exit Sub
    End If
    Select Case RLevel
        Case ResizingLevel.explicit
            Me.FormBorderStyle = Windows.Forms.FormBorderStyle.FixedToolWindow
        Case ResizingLevel.final
            Me.FormBorderStyle = Windows.Forms.FormBorderStyle.SizableToolWindow
         Case ResizingLevel.implicit
            Me.FormBorderStyle = Windows.Forms.FormBorderStyle.SizableToolWindow
    End Select
     
    Zu jedem Problem gibt es mindestens eine Lösung.
    Zu jeder Lösung gibt es mindestens eine bessere Lösung

Ähnliche Themen

  1. flackern bei mouse over / out
    Von mauci im Forum Javascript & Ajax
    Antworten: 0
    Letzter Beitrag: 11.08.09, 08:00
  2. Flackern beim Paint von MDI-Hintergrund
    Von Athor im Forum .NET Windows Forms
    Antworten: 0
    Letzter Beitrag: 23.02.09, 16:06
  3. Flackern im CRichEditCtrl
    Von jokey2 im Forum VisualStudio & MFC
    Antworten: 9
    Letzter Beitrag: 14.05.07, 15:00
  4. Flackern
    Von NMO im Forum VisualStudio & MFC
    Antworten: 6
    Letzter Beitrag: 18.04.06, 23:24
  5. flackern bei Mdi-Childs
    Von masmin im Forum .NET Windows Forms
    Antworten: 4
    Letzter Beitrag: 20.10.05, 11:19