Flackern der Controls bei resize


  • Mod

    Lass doch WS_CLISIBLINGS nur für die Groupbox weg.



  • Lass doch WS_CLISIBLINGS nur für die Groupbox weg.

    Mh die Idee hatte ich auch schon, danke.

    Aber das Resultat ist das gleiche. Der Hintergrund von dem Groupcontrol wird nicht mehr neu gezeichnet.



  • Ich hab mal ein Testprojekt erstellt, wo nichts anderes drin ist als die Groupbox, die Buttons und eine kleine Zeichnung.
    Wenn du es dir mal ansehen willst. (oder jemand anderes)

    WS_CLIPCHILDREN und WS_CLIPSIBLINGS hab ich einfach in der Ressource des Dialogs geändert.

    Edit: Wenns nicht geht, dann geht es nicht. Sag was und ich verwende einfach keine Groupbox. (und stehle nicht mehr deine Zeit.)


  • Mod

    Habe den Code nur angesehen:
    1. Ich habe Dir am Anfang geschrieben, dass Du diesen CMemDC rauswerfen sollst. Inkl. Deinem OnEraseBkGnd Handler.
    2. Wie soll ein Backgroundgezeichnet werden, wenn dies keiner macht? OnEraseBkGnd macht das doch.
    3. Dein Code ist doch selbst die Ursache für das Flackern. Wieso mach Du ein Invalidate am Ende? Nur wegen Deinem Kästchen malen. Muss das sein mit dem OnPant.
    4. WS_CLIPSIBLINGS kannst Du weglassen, en die COntrols sich nicht überlappen.



  • Habe den Code nur angesehen:
    1. Ich habe Dir am Anfang geschrieben, dass Du diesen CMemDC rauswerfen sollst. Inkl. Deinem OnEraseBkGnd Handler.
    2. Wie soll ein Backgroundgezeichnet werden, wenn dies keiner macht? OnEraseBkGnd macht das doch.
    3.a Dein Code ist doch selbst die Ursache für das Flackern.
    3.b Wieso mach Du ein Invalidate am Ende? Nur wegen Deinem Kästchen malen.
    3.c Muss das sein mit dem OnPant.
    4. WS_CLIPSIBLINGS kannst Du weglassen, en die COntrols sich nicht überlappen.

    1. Ja das hast du. Dann flackert aber die Zeichnung unangenehm. Kannst du einfach testen, wenn du "useMemDC=1;" und "useMemDC=0;" testest. (Oder hast du einen anderen Vorschlag, wie ich ohne flackern zeichnen kann?)
    Dazu kommt, dass das Problem des Groupbox Hintergrundes unabhängig davon ist!

    2. Der Hintergrund wird beim CMemDC auf das Bitmap im Speicher gezeichnet, dass im Destruktor dann auf den Dialog gezeichnet wird...

    siehe Datei "memdc.h"
    FillSolidRect(m_rect,GetSysColor(COLOR_BTNFACE));
    ...
    m_pDC->BitBlt(m_rect.left, m_rect.top, m_rect.Width(), m_rect.Height(),this, m_rect.left, m_rect.top, SRCCOPY);
    

    3.a Dass dumme ist dieser Code flackert nicht. Das Problem ist der Hintergrund der Groupbox.
    3.b Ohne das Invalidate (war zu faul für ein InvalidateRect) wird die Zeichnung links nicht gezeichnet.
    3.c Wie soll ich denn sonst Zeichnen?

    4. Naja ich hatte gedacht die Groupbox überlappt mit den 2 Buttons. Und weglassen bringts auch nicht.


  • Mod

    Pack die eigene Zeichnung in ein eigenes Fenster, dass Du wie die anderen Fenster selbst neu resized.

    Dann ist dieses Fenster dafür verantwortlich was passiert. Dieses Fenster selbst benutzt dann eben einen MemDC.

    Das Problem ist, dass Du keinen MemDC vernünftig verwenden kannst, wenn das selbe Fenster auch noch Kindfenster hat.

    Dieser Konstrukt ist aber auch unsinnig. Man zerlegt in solchem Fall einfach die Cient-Fläche in entsprechende Kind-Fenster (wie ich es empfohlen habe).



  • Ok die Zeichnerei mal außen vor gelassen. Selbst dieser einfache Code funktioniert nicht:

    void CFlackerTestDlg::OnSize(UINT nType, int cx, int cy)
    {
     CDialog::OnSize(nType, cx, cy);
     if(!c_Button1.GetSafeHwnd()) return;
    
     c_Groupbox.SetWindowPos(0,cx-220,cy-70 ,200,50,SWP_NOZORDER); // Groupbox
     c_Button1 .SetWindowPos(0,cx-210,cy-50 ,80 ,20,SWP_NOZORDER); // Button 1
     c_Button2 .SetWindowPos(0,cx-110,cy-50 ,80 ,20,SWP_NOZORDER); // Button 2
     c_Button3 .SetWindowPos(0,cx-110,cy-130,80 ,20,SWP_NOZORDER); // Button Abbrechen
    
     InvalidateRect(CRect(cx-210,cy-50,cx-210+80,cy-50+20)); // Button 1
     InvalidateRect(CRect(cx-110,cy-50,cx-110+80,cy-50+20)); // Button 2
    }
    

    Siehe aktualisiertes Projekt. (einfach die FlackerTest.exe ausführen und das Fenster in der Größe ändern dann siehst du das Resultat.)

    Dieser Konstrukt ist aber auch unsinnig. Man zerlegt in solchem Fall einfach die Cient-Fläche in entsprechende Kind-Fenster (wie ich es empfohlen habe).

    Meinst du damit den Konstrukt Groupbox / Buttons? Oder die Zeichnung?


  • Mod

    Und warum invalidierst Du die Buttons? Das muss doch flackern?



  • Wenn ich das nicht mache, dann werden die Buttons hinter der Groupbox nicht angezeigt...
    Und nein, es flackert irgendwie nicht...

    Schaus dir mal an.



  • Hab direkt nach Groupbox und resize gegoogelt. Hab mitbekommen, dass die meisten ihre Flickerfreie Groupbox selber zeichnen 😮
    Hab mich entschlossen sie vorerst weg zu lassen.

    Nützlicher Link: (für andere die die Groupbox nicht einfach weglassen wollen...)
    http://www.codeguru.com/Cpp/W-D/dislog/resizabledialogs/comments.php/c1925/?

    Noch was: Danke für deine Zeit.


Anmelden zum Antworten