Farben verschwinden
-
Hallo,
wenn ich mein Programm minimiere, scrolle oder ein anderes dialogfeld über meine Benutzeroberfläche schiebe verschwinden nach einiger zeit die farben.
ich habe schon einiges ausprobiert, doch nichts hat was gebracht.
Hier mal der Code wie ich die Farben der Steuerelemente setze:HBRUSH CParView::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { hbr1 = CreateSolidBrush(RGB(0, 250, 255)); hbr2 = CreateSolidBrush(RGB(180, 180, 180)); hbr3 = CreateSolidBrush(RGB(255, 255, 255)); hbr4 = CreateSolidBrush(RGB(238, 238, 220)); if (pWnd->GetDlgCtrlID()==IDC_STATIC_IDENTIFIKATION || pWnd->GetDlgCtrlID()==IDC_STATIC_BETRIEBSEINHEIT) { pDC->SetBkMode(TRANSPARENT); pDC->SetTextColor(RGB(0, 0, 0)); return hbr1; } if (pWnd->GetDlgCtrlID()==IDC_STATIC_STATUS|| pWnd->GetDlgCtrlID()==IDC_STATIC_EINHEIT) { pDC->SetBkMode(TRANSPARENT); pDC->SetTextColor(RGB(0, 0, 0)); return hbr2; } return hbr4;...also die methode OnDraw hab ich nicht überschrieben, und OnUpdate hab ich auch noch nie verwendet.
könnte mir jemand bei meinem Problem helfen?
Danke!!
-
du must dein programm anregen das es sich neu zeichnet wenn du es wieder hervorrufst.
entweder mit der OnPaint() function deines programms oder mit der Invalidate()function. diese erklärt dein Dialog für ungültig und regt ihn an sich neu zu zeichnen.
-
Was man erstellt (CreateXXX) muss man auch wieder freigeben. Du hasst einen Speicherleck in deinem Programm.
-
Ich habe keine OnPaint()-Funktion in meinem Programm benutzt, und auch wenn ich den Assistenten öffne ist keine OnPaint()-funktion vorhanden die ich überschreiben könnte.
Kannste mir bitte explizit erkären wie ich dabei vorgehen soll, da ich auch schon vieles in der Richtung ausprobiert habe was nocht funktionierte.
-
Welches Objekt verursacht dieses Speicherleck?
-
im klassenassi die WM_PAINT nachricht setzen dann hast du die OnPaint Function
-
und was soll ich dort dann reinschreiben??
Habe doch zum zeichen der Farben
OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) benutzt, und keine OnPaint() function
-
maRKus23 schrieb:
Welches Objekt verursacht dieses Speicherleck?
hbr 1 - 4
müssen alle mit DeleteObject freigegeben werdne.
das kannst du natürlich nicht in OnCtlColor machen.
-
und wo soll ich sie dann freigeben?
-
im Konstruktor erstellen und im Destruktor freigeben zum Beispiel.
-
Ok, danke!!
Das hat aber aller dings auch noch nicht mein Problem gelöst.
-
Visual C++ 6 in 21 Tagen
[url=http://www.hki.uni-koeln.de/teach/ss06/PS_C++/tag23/21/kap10.htm]Tag 10
SDI-Anwendungen[/url]
kuck mal dort evtl hilft dir das ja ich glaub nämlich schon das du die OnDraw bzw OnPain Function überschreiben must in dem beispiel sorgt nämlich die OnDraw dafür das alles wieder gezeichnet wird sobald du den dialog hervorholst
-
Soweit funktionierts nun, also doch nichts mit neuzeichnen.
Vielen Dank an """""""!!
Nur hab ich jetzt ein neues problem, wenn ich das Debuggen beende, gibts ein Fehler mit der Leseposition und er springt an folgende Stelle:static int __cdecl CheckBytes( unsigned char * pb, unsigned char bCheck, size_t nSize ) { int bOkay = TRUE; while (nSize--) { if (*pb++ != bCheck) { /* Internal error report is just noise; calling functions all report results - JWM */ /* _RPT3(_CRT_WARN, "memory check error at 0x%p = 0x%02X, should be 0x%02X.\n", */ /* (BYTE *)(pb-1),*(pb-1), bCheck); */ bOkay = FALSE; } } return bOkay; }springt auf
if (*pb++ != bCheck)was soll das denn heißen?
-
@ LowFly: Lag wohl doch an dem Speicherleck
-
maRKus23 schrieb:
@ LowFly: Lag wohl doch an dem Speicherleck
Der Farbverlust war ein deutliches Zeichen dafür.

-
trotzdem bekomm ich jetzt diese Zugriffsverletzung.
und ich habe keine Ahnung warum.
-
Wie sieht denn der Callstack aus?
Welcher von deinem Code ist da gerade dran?(Was ein Callstack ist und wie man debugged findest du da.)

-
Na denn werde ich mir das mal bis morgen durchlesen, jetzt mache ich erstmal Feierabend.

Also könnte es sein das noch etwas auf dem Stack liegt wenn ich das Programm beende?
Diese Meldung kam ja erst als ich hbr1-hbr4 auf dem Heap erzeugt habe.

-
Hab mein Problem gelöst!! ^^
//Im Konstruktor hbr1 = NULL; hbr1 = CreateSolidBrush(RGB(0, 0, 0)); //Im Destruktor DeleteObject(hbr1);mein Problem bestand darin das ich delete anstatt DeleteObject verwendete.
Dazu noch 2 kleine Fragen:
-Was ist der Unterschied zwischen delete und DeleteObject?
-Was bedeutet GDI im Kontext mit GDI-Object?
-
Erstmal: Das "hdr1=NULL;" ist überflüssig, weil du den Brush sofort danach korrekt initialisierst.
maRKus23 schrieb:
-Was ist der Unterschied zwischen delete und DeleteObject?
delete löscht nur das Objekt selber, DeleteObject teilt auch deinem System mit, daß das Objekt nicht mehr existiert (andernfalls würde es beim Aufräumen nochmal versuchen, es zu löschen).