GDI-Objekte werden immer mehr



  • Also die suche war ja echt mal besser hier, aber naja.

    Habe ein Problem mit meinen GDI Objekten.
    Ich habe ein Statich welches ich mit einer Farbe hinterlege.

    Jetzt ist das Problem, daß ich jedes mal wenn ich ein Fenster darüber lege, und wieder weg ziehe, das meine Anwendung ein GDI-Objekt mehr hat. Das kann ich so oft wiederholen, wie ich lust habe.

    das ist der Code

    HBRUSH TESTDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
    {
    	HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
    
    	if (pWnd->GetDlgCtrlID() == IDC_RUNMODE)
    	{
    		CString str;
    		m_ctrlRunMode.GetWindowText(str);
    
    		if ( str == "Automatik")
    		{
    			pDC->SetTextColor(RGB(0,0,0)); // Setzt die Textfarbe auf schwarz
    			pDC->SetBkColor(RGB(0,255,0)); // Setzt den Texthintergrund auf grün
    			HBRUSH hBrush = CreateSolidBrush(RGB(0,255,0)); //Setzt die Hintergrundfarbe auf grün
    
    			return (HBRUSH) hBrush;
    		}
    		else
    		{
    			pDC->SetTextColor(RGB(255,255,255)); // Setzt die Textfarbe auf weiß
    			pDC->SetBkColor(RGB(0,0,255)); // Setzt den Texthintergrund auf blau
    			HBRUSH hBrush = CreateSolidBrush(RGB(0,0,255)); //Setzt die Hintergrundfarbe auf blau
    
    			return (HBRUSH) hBrush;
    		}
    	}
    	return hbr;
    }
    

    Hoffe einer kann helfen.



  • Ja gut - du erstellst eine HBrush und lieferst ihn zurück.

    Ich denke doch, dass der Aufrufer das Handle wieder frei gibt?

    Beziehungsweise:
    Wenn das hier wahr ist:

    if (pWnd->GetDlgCtrlID() == IDC_RUNMODE)
    

    dann wird ja der Brush aus der allerersten Zeile nicht zurückgegeben und auch nicht gelöscht.



  • Der Aufrufer ist in diesem Fall eine Klasse der MFC.

    Man könnte ja mal gucken, ob es hilft, wenn man im Konstruktor die Brushes erstellt und dann blos die fertig erstellten zurück gibt. 🙂

    Ich mache das allerdings genauso und hatte noch kein Problem und bin auch der Meinung, dass das in Beispielen auch so gemacht wird. 😕



  • Wie? So?

    HBRUSH TESTDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
    {
    	HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
    	HBRUSH hBrush1 = CreateSolidBrush(RGB(0,255,0)); //Setzt die Hintergrundfarbe auf grün
    	HBRUSH hBrush2 = CreateSolidBrush(RGB(0,0,255)); //Setzt die Hintergrundfarbe auf blau
    
    	if (pWnd->GetDlgCtrlID() == IDC_RUNMODE)
    	{
    		CString str;
    		m_ctrlRunMode.GetWindowText(str);
    
    		if ( str == "Automatik")
    		{
    			pDC->SetTextColor(RGB(0,0,0)); // Setzt die Textfarbe auf schwarz
    			pDC->SetBkColor(RGB(0,255,0)); // Setzt den Texthintergrund auf grün
    //			HBRUSH hBrush = CreateSolidBrush(RGB(0,255,0)); //Setzt die Hintergrundfarbe auf grün
    
    			return hBrush1;
    		}
    		else
    		{
    			pDC->SetTextColor(RGB(255,255,255)); // Setzt die Textfarbe auf weiß
    			pDC->SetBkColor(RGB(0,0,255)); // Setzt den Texthintergrund auf blau
    //			HBRUSH hBrush = CreateSolidBrush(RGB(0,0,255)); //Setzt die Hintergrundfarbe auf blau
    
    			return hBrush2;
    
    		}
    	}
    	return hbr;
    }
    

    -----------------

    So geht es garnicht.
    Da wird das ganze deutlich mehr.



  • haedfinger schrieb:

    Wie? So?

    Nein, das ist noch schlimmer. So erstellst du 2 GDI-Objekte pro Aufruf von OnCtlColor. Mach die Handles zu Membern von TESTDlg und erstelle sie im Konstruktor. Oder nimm gleich CBrush.



  • Wenn ich ihn nur im Konstruktor erstelle geht es. Danke.
    Aber lieber wär mir wenn ich die Member sparen könnte.!!

    Dennoch danke



  • haedfinger schrieb:

    Wenn ich ihn nur im Konstruktor erstelle geht es. Danke.
    Aber lieber wär mir wenn ich die Member sparen könnte.!!

    Du könntest das auch mit statischen Variablen in der Methode machen. Aber warum willst du Member sparen?


Log in to reply