CreateSolidBrush liefert NULL



  • Hallo zusammen,

    habe eine Dialoganwendung und manchmal (eher ziemlich oft) habe ich das Problem, dass das Dialogfenster nicht richtig gezeichnet wird.

    Wenn ich debugge sehe ich, dass

    CreateSolidBrush(RGB(0,0,0));
    

    NULL zurück liefert und somit kein gültiger Pinsel zum Zeichnen da ist.

    Jetzt die Frage:

    Wann liefert CreateSolidBrush NULL zurück?

    Wenn ich mit GetLastError() den letzten Fehler hole, dann bekomme ich immer "Der Vorgang wurde erfolgreich abgeschlossen".

    Hat jemand eine Idee?

    Danke und Gruß


  • Mod

    CreateSolidBrush liefert NULL wenn keine Ressourcen mehr vorhanden sind.
    Das dauert aber ziemlich lange.
    Bist Du sicher das NULL returniert wird.

    Zeige mal etwas mehr von Deinem Code.
    Kann es sein, dass Du in Deinem OnDraw Code den Brush erzeugst und nicht wieder deselektierst bevor Du ihn zerstörst?



  • Im Endeffekt siehts so aus:

    HBRUSH CDlg::OnCtlColor (CDC* pDC, CWnd* pWnd, UINT nCtlColor)
    {
        HBRUSH hbr = CDialog::OnCtlColor (pDC, pWnd, nCtlColor);
        HBRUSH hBGBrush = CreateSolidBrush (RGB(128,184,223));
    
        if (...)
        {
            HBRUSH hBGEdit = CreateSolidBrush (RGB(0,0,0));
            if (hBGEdit)
                return hBGEdit;
        }
    
        return hbr;
    }
    

    Wo muss ich ihn deselktieren und zerstören?



  • Du erzeugst bei jedem OnCtlColor()-Aufruf einen neuen Brush - und die Funktion wird recht oft aufgerufen (afaik mindestens einmal bei jedem OnPaint). Leg die Objekte lieber einmal am Anfang an und gib sie dann nur noch zurück, wenn sie angefordert werden. (um das (De)Selektieren sollte sich die OnPaint() kümmern, aber das Löschen mußt du selber übernehmen)



  • Leg die Objekte lieber einmal am Anfang an und gib sie dann nur noch zurück

    du meinst als Klassenmember?

    Und Löschen dann im Destruktor ...?

    Klingt gut, werd ich mal probieren



  • Alternativ kannst Du einen schwarzen Pinsel auch über

    HBRUSH hBlackBrush = (HBRUSH) GetStockObject(BLACK_BRUSH);
    

    abrufen. Dieser muss (und darf) nicht freigegeben werden.


Anmelden zum Antworten