CColorDialog und Button einfärben



  • Hallo

    Habe ein Problem mit dem einfärben eines Buttons der den CColorDialog aufruft.

    Hier der Code für den Buton damit dieser CColorDialog aufruft

    void CSettingsDlg::OnBnClickedButton1()
    {
    	// TODO: Fügen Sie hier Ihren Kontrollbehandlungscode für die Benachrichtigung ein.
    
    	startfarbe1 = RGB( 255, 0, 0 );
    	CColorDialog dlg(startfarbe1);
    	if (IDOK == dlg.DoModal())
    	{
    	color1 = dlg.GetColor();
    	//TRACE("Rot = %u, Grün = %u, Blau = %u\n", GetRValue(color1), GetGValue(color1), GetBValue(color1));
    	}
    }
    

    Hier das einfärben des Buttons

    void CSettingsDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
    {
    	// TODO: Fügen Sie hier Ihren Meldungsbehandlungscode ein, und/oder benutzen Sie den Standard.
    
    	if(nIDCtl==IDC_BUTTON1)
    	{
    	CDC dc;
    
    	dc.Attach(lpDrawItemStruct ->hDC);
    	RECT rect;
    	rect= lpDrawItemStruct ->rcItem;
    
    	dc.Draw3dRect(&rect,RGB(255,255,255),RGB(0,0,0));
    	dc.FillSolidRect(&rect,color1);
    	UINT state=lpDrawItemStruct->itemState;
    
    	if((state & ODS_SELECTED))
    	{
    		dc.DrawEdge(&rect,EDGE_SUNKEN,BF_RECT);
    
    	}
    	else
    	{
    		dc.DrawEdge(&rect,EDGE_RAISED,BF_RECT);
    	}
    
    	dc.SetBkColor(color1);
    	//dc.SetBkColor(GetSysColor(COLOR_BTNFACE));
    	//dc.SetTextColor(RGB(255,0,0));
    
    	TCHAR buffer[MAX_PATH];
    	ZeroMemory(buffer,MAX_PATH );
        ::GetWindowText(lpDrawItemStruct->hwndItem,buffer,MAX_PATH);
    	dc.DrawText(buffer,&rect,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
    
    	dc.Detach();
    	}				
    
    	CDialog::OnDrawItem(nIDCtl, lpDrawItemStruct);
    }
    

    So jetzt will ich das so machen das wenn ich den Dialog aufrufe der Button schon eingefärbt ist und zwar mit der definierten "Startfarbe".

    Dann soll sich die Farbe des Buttons ändern wenn ich diese ausgewählt habe und auf "OK" drücke und nicht erst wenn ich den Button noch mal anklicke.

    Wie realisiere ich das?

    MFG
    Shona



  • Fehlt da ein Invalidate?



  • estartu schrieb:

    Fehlt da ein Invalidate?

    Wo denn?
    Den Code für das einfäben habe ich nur kopiert von einem Beispiel.
    Das einzigste was ich geändert habe ist die Farbencodes als Variable ersetzt.



  • Unter color1 = dlg.GetColor(); , da dort ein Neuzeichnen am sinnvollsten ist.



  • estartu schrieb:

    Unter color1 = dlg.GetColor(); , da dort ein Neuzeichnen am sinnvollsten ist.

    Danke das hat funktioniert.
    Wie mache ich das nun aber das der Button schon beim aufruf des Dialogs eingefärbt ist?

    EDIT:
    Da ich die Farbe an das Hauptprogramm übergeben muss und dies ohne Probleme funktioniert habe ich es geschafft das der Button schon bei aufruf eingefäbt ist.

    Das Problem ist aber das dieser schwarz ist, er aber eine andere Farbe haben muss. Geht das überhaupt??



  • Wo/Wann legst du die Farbe denn fest?



  • estartu schrieb:

    Wo/Wann legst du die Farbe denn fest?

    Na in dem folgenden Code (das fett markierte)

    void CSettingsDlg::OnBnClickedButton1() 
    { 
        // TODO: Fügen Sie hier Ihren Kontrollbehandlungscode für die Benachrichtigung ein. 
    
        startfarbe1 = RGB( 255, 0, 0 ); // Hier wird die Farbe beim Start definiert
        CColorDialog dlg(startfarbe1); // Hier wird sie dann beim Aufruf gesetzt
        if (IDOK == dlg.DoModal()) 
        { 
        color1 = dlg.GetColor(); 
        //TRACE("Rot = %u, Grün = %u, Blau = %u\n", GetRValue(color1), GetGValue(color1), GetBValue(color1)); 
        } 
    }
    

    Wenn ich den Farbdialog aufrufe ist die farbe "Rot" auch markiert nur der Button ist Schwarz gefärbt.



  • Hmm, ich glaub ich hab die Kurve noch nicht ganz...
    Du hast einen CSettingsDlg mit Knopf drauf der in einer gewählten bzw. beim Start festgelegten Farbe gemalt werden soll. Es klappt mittlerweile (nach Einbau des Invalidate), dass nach dem Wählen der Farbe auch der Knopf richtig gefärbt ist.
    Aber die Startfarbe kommt nicht so recht an.

    Ich vermute, dass da was mit dem Initialisieren der Farbe nicht ganz passt.
    OnBnClickedButton1 ist nämlich nicht die Funktion wo so eine Initialisierung hingehört (die wird ja viel zu spät aufgerufen).
    Pack die Zeile startfarbe1 = RGB( 255, 0, 0 ); // Hier wird die Farbe beim Start definiert mal in die OnInitDialog. Dann sollte es klappen.



  • estartu schrieb:

    Hmm, ich glaub ich hab die Kurve noch nicht ganz...
    Du hast einen CSettingsDlg mit Knopf drauf der in einer gewählten bzw. beim Start festgelegten Farbe gemalt werden soll. Es klappt mittlerweile (nach Einbau des Invalidate), dass nach dem Wählen der Farbe auch der Knopf richtig gefärbt ist.
    Aber die Startfarbe kommt nicht so recht an.

    Soweit hast du alles richtig verstanden

    estartu schrieb:

    Ich vermute, dass da was mit dem Initialisieren der Farbe nicht ganz passt.
    OnBnClickedButton1 ist nämlich nicht die Funktion wo so eine Initialisierung hingehört (die wird ja viel zu spät aufgerufen).
    Pack die Zeile startfarbe1 = RGB( 255, 0, 0 ); // Hier wird die Farbe beim Start definiert mal in die OnInitDialog. Dann sollte es klappen.

    Funktioniert leider nicht wenn ich es in OnInitDialog reinsetze.

    Es gibt zwei Codestellen die für die Farbe zuständig sind aber ich habe schon beide ausprobiert, funktioniert leider nicht.

    dc.FillSolidRect(&rect,color2);
    

    oder

    dc.SetBkColor(color1);
    

    Wenn ich allerdings beim ersten die Variable ändere, dann ist der Button beim Start in der Farbe. Nur dann habe ich das Problem das er sich nicht mehr ändern lässt.



  • Shona schrieb:

    Es gibt zwei Codestellen die für die Farbe zuständig sind aber ich habe schon beide ausprobiert, funktioniert leider nicht.

    dc.FillSolidRect(&rect,color2);
    

    oder

    dc.SetBkColor(color1);
    

    Wenn ich allerdings beim ersten die Variable ändere, dann ist der Button beim Start in der Farbe. Nur dann habe ich das Problem das er sich nicht mehr ändern lässt.

    Wie änderst du die Variable? Was passiert, wenn du color2 zu Anfang auf rot setzt?



  • Na ganz einfach

    dc.FillSolidRect(&rect,color1);
    

    ändere ich in

    dc.FillSolidRect(&rect,startcolor1);
    

    Wenn ich das so ändere dann ist der Button Rot wenn der Dialog auf geht, aber er lässt sich nicht mehr ändern

    (Entschuldige hab vorhin statts "color1", "color2" geschrieben)



  • Dann lass startfarbe doch mal ganz weg und ändere die Zeilen

    startfarbe1 = RGB( 255, 0, 0 ); // Hier wird die Farbe beim Start definiert
        CColorDialog dlg(startfarbe1); // Hier wird sie dann beim Aufruf gesetzt
    

    in

    color1 = RGB( 255, 0, 0 ); // Hier wird die Farbe beim Start definiert
        CColorDialog dlg(color1); // Hier wird sie dann beim Aufruf gesetzt
    

    Oder wird die noch irgendwo genutzt?



  • Ja klar wird die noch wo genutzt

    Die beiden Codestellen von vorhin brauchen die variable color1 damit sich der Button in der Farbe ändern lässt, ansonsten ist der Button ja immer Rot.

    Außerdem brauche ich diese in folgender Zeile, weil ja diese Methode ein COLORREF Struktur zurückliefert und mir somit die ausgewählte Farbe.

    color1 = dlg.GetColor();

    Da ich das aber so machen muss, das beim Dialogaufruf der Button schon eine Farbe hat, brauche ich eine zweite Variable (startfarbe1) um diese fest zu legen.



  • Shona schrieb:

    Ja klar wird die noch wo genutzt

    Die beiden Codestellen von vorhin brauchen die variable color1 damit sich der Button in der Farbe ändern lässt, ansonsten ist der Button ja immer Rot.

    Da ich das aber so machen muss, das beim Dialogaufruf der Button schon eine Farbe hat, brauche ich eine zweite Variable (startfarbe1) um diese fest zu legen.

    Du hast mich falsch verstanden. Ich fragte nach startfarbe und nicht nach color1.

    Was spricht dagegen, startfarbe gegen color1 auszutauschen, hast du es mal versucht?



  • estartu schrieb:

    Du hast mich falsch verstanden. Ich fragte nach startfarbe und nicht nach color1.

    Was spricht dagegen, startfarbe gegen color1 auszutauschen, hast du es mal versucht?

    Hab dich wirklich falsch verstaden *schäm*
    Hab es mal gemacht und siehe da es funktioniert, DANKE 😃



  • Na da bin ich beruhigt. 🙂


Anmelden zum Antworten