B
Aloha,
ich habe eine Formview, die ab und zu einen Dialog aufruft.
Dieser Dialog hat diverse statische Elemente, die ich gerne einfärben wollte mit folgendem Code
HBRUSH CEinweisen2::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
switch (nCtlColor)
{
case CTLCOLOR_STATIC:
pDC->SetBkMode(TRANSPARENT);
HBRUSH B = CreateSolidBrush(RGB(96,154,226));
return (HBRUSH) B;
break;
}
return hbr;
}
Nach ca. 100x öffnen des Dialoges kam der Supergau, die statischen Elemente wurden erst Windowsgrau, bzw. gar nicht mehr gezeichnet, der Dialog konnte keine Bilder mehr laden, sah aus als ob der Graka-Speicher übergelaufen ist, das Proggi stürzte schließlich ab mit der Meldung "Soll ich an Mickysoft eine Fehlermeldung senden"
Ich bin mir fast sicher, daß der Graka-Speicher übergelaufen ist, kann es aber net nachvollziehen.
Folgende Lösung ließ ein unendliches Öffnen ( habe 200x getestet ) zu und kein Absturz.
CBrush m_brush_elemente; // Angelegt als Variable im Public-Bereich der Klasse
m_brush_elemente.CreateSolidBrush(RGB(1,1,1)); // Initialisiert im Konstructor der Klasse
m_brush_elemente.DeleteObject() // Vernichtet im Destructor der Klasse
// Im OnCtlColor folgendes geändert
case CTLCOLOR_STATIC:
{
hbr = (HBRUSH) elemente_farbe;
break;
}
}
Nu lüppt it....
Meine Frage an die Speicher-experten. Kann es sein, daß in der oberen Variante einfach immer wieder ein CGDIObject erzeugt wird, und nicht gelöscht, und deshalb der Supergau irgendwann kommt ?
Ich weiß es net, würde aber gerne begreifen, warum die erste Variante net funzt.
Beste Grüße und Dank
BOA