zum 100000mal textfarbe



  • hi,
    hab jetzt ein paar stunden foren und bücher gewältzt, geht nix,

    würde gerne textfarbe und hintergrundfarbe ändern, als erstes würde mir aber schon die textfarbe reichen, hab folgendes aus einem buch ausprobiert:

    CWnd* pWnd = (CWnd*)GetDlgItem(IDC_TESTTEXT);
    CDC* pDC = pWnd->GetDC();
    pDC->SetTextColor(RGB(1,0,100));
    pWnd->SetWindowText("anderer Text");

    der text wird verändert, die farbe nicht,
    muss ich noch irgendwelche klassen einbinden?!?
    bin absoluter c++ anfänger 🙄
    danke schon mal
    Al



  • Servus,

    eine Möglichkeit:

    .cpp

    BEGIN_MESSAGE_MAP(CIConnectDlg, CDialog)
    	ON_WM_PAINT()
    	ON_WM_QUERYDRAGICON()
    	ON_WM_CTLCOLOR() //<<<<----------------------- das hinzufügen
    	ON_WM_CLOSE()
    	//}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    
    HBRUSH CIConnectDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
    { 
        HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); 
    
        if (pWnd->GetDlgCtrlID()==IDC_DEINE_CTRL_ID)
    	{ 
            pDC->SetTextColor(RGB(192,192,192)); 
    		pDC->SetBkMode(TRANSPARENT); 
            HBRUSH B = CreateSolidBrush(RGB(0,0,0)); 
            return (HBRUSH) B;     
    	} 
        return hbr; 
    }
    

    .h

    afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
    

    zur genaueren Erklärung schaust du mal in die FAQ da steht der Quelltext drin oder guckst mal in der MSDN da steht das auch beschrieben.

    *winke*
    Hellsgore



  • Hallo,

    zu der Möglichkeit von Hellsgore hab ich da noch ´ne Frage:

    Was mache ich, wenn ich die Farbe zwischendurch bei z.B. Werteänderung ändern will?
    Wo übergebe ich denn die Farbe?

    Ich muss dazu erwähnen, dass ich ganz am Anfang dieser Farbgeschichte bin... 🙄

    Oscar



  • Membervariable im Dialog, in der du den Farbwert speicherst...

    Devil



  • Hallo,

    vielleicht stehe ich nicht nur am Anfang der Farbgeschichte...

    Ich habe jetzt eine Membervariable angelegt... obwohl mir da wahrscheinlich schon irgendwas fehlt (Verständnis,Grundlagen usw.), denn diese kann nur die Typen CStatic oder CString annehmen.

    Wie um alles in der Welt komme ich jetzt dahin, dass ich in diese Variable einen Farbwert eintragen kann.

    Falls der Fehler zwischen meinen Ohren liegt, sagt ruhig bescheid.

    Gruß, Oscar



  • Hellsgore, aber der Brush B muss wieder freigegeben werden



  • Aloha,

    erstmal willkommen im Board. 👍

    Wir müssen das Thema ein bißchen teilen, fangen wir mit der Textfarbe an.
    Du hast devil falsch verstanden. Du sollst Dir keine Membervariable für das Staticfeld anlegen, sondern eine für die textfarbe.

    COLORREF textfarbe;
    

    Im InitDialog machst Du einfach folgendes für die ursprüngliche Textfarbe.

    textfarbe = RGB(222,222,222) // Den Wert den Du willst
    

    Nun änderst Du bloß noch im OnCtlColor() :

    pDC->SetTextColor(textfarbe);
    

    Willst Du die Textfarbe jetzt auf irgendein Event ändern (Button oder MouseMouve oder sonstwas ) änderst Du einfach, indem Du die textfarbe neu belegst, so wie im InitDialog ( Lösung untern )

    Beim Brush wird es schwieriger, wie Servos schon erwähnt, wenn Du nur Hellsgores Quelltext nutzt, ohne den Brush zu löschen sagt Dein Proggi (bzw. die Graka ) irgendwann "Winkewinke Game over" 🙂 .

    Ich würde es folgendermaßen lösen, wenn Du auch den Hintergrund ändern willst.
    Eleganz lasse ich mal außen vor.

    Lege Dir ne Memberfunktion names Change_Colors(COLORREF,COLORREF) an, sowie eine Membervariable namens

    CBrush m_brush;
    

    Dann noch im Konstruktor folgende Zeile :

    m_brush.CreateSolidBrush(RGB(222,222,222));   // ursprungshintergrund
    

    Und im Destruktor

    m_brush.DeleteObject()
    

    Im OnCtlColor() muß es dann so aussehen :

    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);  
    
        if (pWnd->GetDlgCtrlID()==IDC_DEINE_CTRL_ID) 
        {  
            pDC->SetTextColor(textfarbe);  
            pDC->SetBkMode(TRANSPARENT);    
            return (HBRUSH) m_brush;      
        }  
        return hbr;
    

    In die Memberfunktion Change_Colors schreibst Du folgendes :

    Change_Colors(COLORREF text, COLORREF bk){
    
         m_brush.DeleteObject();
         m_brush.CreateSolidBrush(bk);
         textfarbe = text;
         RedrawWindow();
    
    }
    

    Jetzt brauchst Du nur noch am Beispiel Buttonklick zu reagieren :

    [code]
    OnButton1{

    change_farben(RGB(222,222,222),RGB(123,123,123));

    }

    Willst Du mehrere Staticelemente in unterschiedlichen Text- und Hintergrundfarben haben mußt Du natürlich mehrere change_farben - Funktionen anlegen und OnCtlColor entsprechend erweitern.

    Und alles wird gut.

    Grüße

    BOA



  • Hallo,

    besten Dank auch, klappt einwandfrei 😃

    Gruß, Oscar


Anmelden zum Antworten