Flackern einer selbst gezeichneten ListBox verhindern

  • VB.NET

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von jvbsl.

    Flackern einer selbst gezeichneten ListBox verhindern

    Ich bin gerade dabei, mir eine eigene ListBox zu bauen, weil ich die für ein Projekt brauche, aber ich bin mal wieder über das GDI-typische Problem gestolpert: das Flackern.
    Wie kann ich das abdrehen, die Eigenschaft DoubleBuffered auf True zu setzen hat nichts gebracht.
    Nachtrag: Es flackert beim Scrollen, beim Vergrößern und Verkleinern der Form, und beim Auswählen von Items (obwohl SelectionMode auf None ist ?( )
    ist es ein vereerbtest Control? Dann stellst du dort DoubleBuffering ca. so ein(in der New Methode):

    VB.NET-Quellcode

    1. Me.SetStyle(OptimizedDoubleBuffer Or UserPaint Or AllPaintingInWMIPaint,True)

    (wer abschreibt macht weniger Fehler :P, bzw. bekommt hilfe von der IDE)...
    wenn es nicht geerbt hat, kannst du soweit ich weiß sogar denselben Code im Formular anwenden, das sollte dann auch auf die ListBox übernommen werden...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Das ist erstmal noch kein Usercontrol, und m.W. nichts vererbtes. (Was ist das? :p)
    Das ist ne normale Listbox, die ich aus der Toolbox gezogen habe, bei der der DrawMode auf OwnerDrawFixed steht.
    Dann hab ich im DrawItem-Event die Items neu gezeichnet, fertig. :D
    Me.SetStyle probier ich jetzt mal aus.
    Edit: WIE bekomme ich die New-Methode überschrieben, es hagelt wieder Fehler, wenn ich Public Sub New() schreibe >.<

    Screenshot der ListBox in Aktion:
    (Nutzern der iPhone-App "Twitterrific" dürfte diese Art von ListBox bekannt vorkommen ;)
    hmm, war da länger nicht im Thema drin: früher war doch DoubleBuffered beim ListviewEigenschaft protected ?

    Habe mich da immer mit dem folgenden Code über Reflection behelfen müssen:

    VB.NET-Quellcode

    1. lvStatus.GetType().GetProperty("DoubleBuffered", BindingFlags.NonPublic Or BindingFlags.Instance).SetValue(lvStatus, True, Nothing)


    Wäre schön wenn es mittlerweile einfacher geht ...
    Das ist ne ListBox, keine ListView. ;)
    Und beide Codes funktionieren nicht, ich hab die allerdings im Form_Load-Event benutzt, da ich nicht weiß, wie die in die New-Methode kommen.
    (Es kamen allerdings keine Fehler/Warnungen etc)
    neeein kein Reflection...
    um die New Methode zu "überschreiben " wählst du in der linken ComboBox "Formularname" aus, aber nicht das mit dem Blitz, sondern das darüber...nun wählst du in der rechten Liste nur noch New aus und schon siehst du deine schöne New Methode...dort schreibst du deinen Code dann schließlich nach InitializeComponent()...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Samus, ich habe gesehen dass Du eine Listbox benutzt , muss aber gestehen ich war zu faul nachzuschlagen ob DoubleBuffered bei Listboxen genauso protected ist :)

    Und bei Listviews funktioniert obiger Code immer noch prächtig ...

    Edit: @jvsbl geht Dein Tip auch mit ListView ? Bin gerade in der Arbeit und kann wenig nachschlagen oder gar ausprobieren ...
    *headdesk*

    Da hätte ich lange suchen können X(
    Danke ;)

    VB.NET-Quellcode

    1. Public Sub New()
    2. ' Dieser Aufruf ist für den Windows Form-Designer erforderlich.
    3. InitializeComponent()
    4. Me.SetStyle(ControlStyles.OptimizedDoubleBuffer, True)
    5. Me.SetStyle(ControlStyles.UserPaint, True)
    6. Me.SetStyle(ControlStyles.AllPaintingInWmPaint, True)
    7. ' Fügen Sie Initialisierungen nach dem InitializeComponent()-Aufruf hinzu.
    8. End Sub


    So, es flackert immer noch wie vorher :/
    dann wirste wohl das ganze mit einem geerbten Control machen müssen(ist nicht nur schöner, sondern da bin ich mir auch sicher, dass es Funktioniert...aus eigener Erfahrung^^)

    VB.NET-Quellcode

    1. Public Class ListBoxExtended
    2. Inherits System.Windows.Forms.ListBox
    3. End Class

    @Kangaroo: Ja, das sollte ebenso mit einem ListView möglich sein ;)

    Edit: achja bei dem geerbten Steuerelement hast du dann auch Zugriff auf dessen Protected Variablen...^^
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    was du machen willst :P
    da du selbst zeichnen willst, setz dort wiederum in der New Methode OwnerDraw entsprechend...
    ebenso verwendest du hier auch SetStyle...
    und dann musst du auch hier nur wieder im DrawItem Event zeichnen ;)
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---