WM_PAINT + Ownerdrawn Control: Programm zeichnet außerhalb der Clipping Region



  • Hallo liebe Community,
    Ich habe ja vor kurzem schon mal eine Frage wegen meinem eigenen ProgressBar-Control gestellt. Jetzt stehe ich wieder vor einem Problem ^^
    Das Zeichnen von einfachen ProgressBars mit Textausgabe funktioniert super. Jetzt wollte ich die Sache erweitern und von im Prinzip 2 farbigen Rechtecken wegkommen und diese wenigstens mit abgerundeten Ecken ausstatten. Das mache ich über Regionen. Seitdem hängt sich das Programm auf, nachdem ich ca 3320 mal die Bar neu zeichnen lassen habe, wird die ProgressBar auf der (0,0) Position der System Region gezeichnet, also außerhalb des Fensters (lasse die Bar testeshalber per Timer steppen und nach 3320 mal steppen zeichnet er da rein). Meine erste Lösung war, die System Region selbst zu setzen bzw. einzuschränken. Hat auch "gut" geklappt, die Bar wurde nicht mehr außerhalb gezeichnet. Trotzdem hängt sich die Bar aber auf. Also egal, ob ich mir den DC über BeginPaint/EndPaint oder über GetDCEx/ReleaseDC hole, die Bar hängt sich nach den heiligen 3328 mal auf.

    Deshalb frage ich mich jetzt, ob es da vom System aus vllt. eine bestimmte Beschränkung gibt, wie oft ein Fenster neu gezeichnet werden darf, bzw. ob vllt. die Position wo die Bar ist mehr oder weniger "volläuft" nach der Anzahl X neuzeichnen und/oder wo mein Fehler liegt ..

    Hier mal die beiden Varianten, wie ich die Regionen setze bzw. die Bar zeichne:

    BeginPaint/EndPaint

    HRGN barRegion;
    
                GetClientRect (xbms->bar, &rect);
                if (xbms->bModern == TRUE)
                    barRegion = CreateRoundRectRgn (1, 1, rect.right - rect.left - 1, rect.bottom - rect.top - 1, 6, 6);
                else
                    barRegion = CreateRectRgnIndirect (&rect);
    
                hdc = BeginPaint (xbms->bar, &ps);
    
                SetWindowRgn (xbms->bar, barRegion, FALSE);
    
                [...]
    
                EndPaint (xbms->bar, &ps);
                DeleteObject (barRegion);
    
                return 0;
    

    GetDCEx/ReleaseDC

    HRGN barRegion;
    
                GetClientRect (xbms->bar, &rect);
                if (xbms->bModern == TRUE)
                    barRegion = CreateRoundRectRgn (1, 1, rect.right - rect.left - 1, rect.bottom - rect.top - 1, 6, 6);
                else
                    barRegion = CreateRectRgnIndirect (&rect);
    
                HRGN excludeRegion = CreateRectRgn (rect.left, rect.top, rect.right, rect.bottom);
                CombineRgn (excludeRegion, excludeRegion, barRegion, RGN_XOR);
    
                POINT pt = {0,0};
    			MapWindowPoints (xbms->bar, NULL, &pt, 1);
    			OffsetRgn (excludeRegion, pt.x, pt.y);
    
                hdc = BeginPaint (xbms->bar, &ps);
                SelectClipRgn (hdc, barRegion);
    
                SendMessage (xbms->bar, WM_ERASEBKGND, (WPARAM) hdc, (LPARAM) 0);
                ValidateRect (xbms->bar, NULL);
    
                [...]
    
                ReleaseDC (xbms->bar, hdc);
                DeleteObject (barRegion);
                DeleteObject (excludeRegion);
    

    Danke schonmal für eure Mühe ... (:



  • okay, hab den fehler, war ein speicherleck, ich döddel ^^


Anmelden zum Antworten