Schwierigkeiten beim Button einfärben



  • Hallo, ich habe nach der Anleitung hier im Forum versucht einen Button einzufärben. Hab einfach in die OnCtlColor folgendes geschrieben

    HBRUSH CButtuonDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
    {
        HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
    
        // TODO: Attribute des Gerätekontexts hier ändern
        switch(pWnd->GetDlgCtrlID())
      {
      case IDC_BUTTON1:
        {
          pDC->SetTextColor(RGB(220,222,242)); //<--textfarbe
          pDC->SetBkColor(RGB(58,60,105)); // <-- hintergrundfarbe
          pDC->SetBkMode(TRANSPARENT);
        } break;
      default:
        {
          return hbr;
        } break;
      }   
    
        // TODO: Anderen Pinsel zurückgeben, falls Standard nicht verwendet werden soll
        return hbr;
    }
    

    Leider ist der Buton immer noch so grau wie vorher.
    Weiss jemand woran das liegen könnte.





  • hab das versucht, aber das prog lässt sich jetzt nicht mehr ausführen.
    hab mir auch die cpp Datei dieses Beispiels angeschaut und die ist ziemlich umfangreich für so ein kleines Problem.

    Die Frage von mir ist eigentlich ja nur, warum sich die Buttons nicht färben mit der Funktion OnCtlColor? Bei Edit-Feldern und bei Static-Feldern geht es ja auch ohne Probleme.



  • Servus,

    Bob Ryan schrieb:

    One of the problems with the Windows architecture is in the inability to draw buttons in a color other than gray. While the class offered here isnt cutting-edge technology, it is something that a lot of people ask for and use (especially in multi-media applications). The only way to draw the buttons in color is to use the owner-draw capabilities (or create a bitmap button which is a horrible solution). CColorButton does all this behind the scene and allows the developer to:

    Du warst bestimmt nicht in der Stimmung dir das durchzulesen *g*. Ich habs mal fett markiert.

    Du brauchst aber im Prinzip nur die Klasse einzubinden. Steht ja auch beschrieben wie du es einbinden sollst (kannst).

    *winke*
    Hellsgore



  • ich hab das beispiel schon probiert, aber mit eingebundener CColorButton lässt sich meine App nicht mehr starten.



  • Was sagt er denn für einen Fehler?

    Wir gehen das mal Schritt für Schritt durch:

    1. colorbtn.cpp und .h einbinden
    2. In deine Project.h die colorbtn.h includen
    3. Eine Membervar davon anlegen

    public:
      CColorButton m_clButton1;
    

    4. Einen Button auf deinen Dialog setzen und Eigenschaft OwnerDraw auf TRUE setzen.
    5. In deine Project.cpp unter OnInitDialog() folgendes einsetzen:

    COLORREF CLOUDBLUE = RGB(128, 184, 223);
    COLORREF WHITE = RGB(255, 255, 255);
    COLORREF BLACK = RGB(1, 1, 1);
    
    m_clButton1.Attach(IDC_BUTTON1, this, CLOUDBLUE, BLACK, WHITE)
    

    IDC_BUTTON1 ist die ID des Controls.

    und nun solltest du einen farbigen Button haben. Oder? 😉

    *winke*
    Hellsgore



  • versuch mal aus scherz ob du den button mit transparent auch durchsichtig hinbekommst. sowas brauch ich noch. hab nur leider keine zeit dafür das zu testen



  • Also ich habe jetzt herausgefunden, wo das Problem liegt.

    Ich kann einen Button nach der obigen Anleitung einfärben, allerdings nur, wenn er nur eine Variable vom Typ CColorButton hat. Ich habe allerdings nen Button, welchen ich auch über eine Control-Variable vom Typ CButton behandeln will (SetFocus, GetFocus etc.). wenn ich dem farbigen Button eine Variable im Klassenassistenen vom Typ CButton zuweise, funktioniert die App nicht mehr. Es gibt zwar keinen Fehler beim erstellen, aber beim Ausführen startet die App gar nicht. es kommt folgende Fehlermeldung:

    Debug assertion failed!

    Weiss jemand woran das liegen kann?



  • Du brauchst ja auch keine Extra Membervar von deinem Button anzulegen. Du benutzt nun einfach, für weitere Aktionen, die Variable vom Typ CColorButton. Die ist ja nur abgeleitet von der Klasse CButton.

    *winke*
    Hellsgore



  • dANKE an alle,

    hab´s nach einigem probieren hinbekommen 🙂



  • Das nennt sich vererbung. Die Klasse CColorButton erbt von CButton alles wichtigen Methoden.
    Somit kann man die auch verwenden. Fehlt etwas an Grundlagen!



  • Ist es möglich, dass diese Klasse nicht die Möglichkeit bietet, Farben während der Laufzeit zu wechseln? Also den Hintergrund abhängig vom Focus zu gestalten?



  • Weiss denn da niemand einen Rat, wie ich die Farben der Buttons zur Laufzeit ändern kann



  • Hallo, ich weiß jetzt nicht ob das klappt habs nicht getestet, aber vielleicht hilft dir UpdateData() weiter. Kann es dir aber nicht versprechen. Aber einen Versuch ist es ja wert, oder? 😉



  • Servus,

    ich hätte da eine Idee. Ist aber nicht sauber getestet.

    in die colorbtn.h eintragen:

    public:
       BOOL ChangeColor(const COLORREF BGColor, const COLORREF FGColor, const COLORREF DisabledColor);
    

    in die colorbtn.cpp eintragen:

    BOOL CColorButton::ChangeColor(const COLORREF BGColor, const COLORREF FGColor, const COLORREF DisabledColor)
    {
    	m_fg = FGColor;
    	m_bg = BGColor; 
    	m_disabled = DisabledColor;
    
             CColorButton::RedrawWindow();
    
    	return TRUE;
    }
    

    in CDeinDlg.cpp:

    void CDeinDlg::OnDrueckeKnöppsche()
    {
       m_clButton1.ChangeColor(RGB(100,100,100), RGB(100,6,100), RGB(100,100,100));
       //m_clButton1.SetWindowText("Hallo");
    
    }
    

    m_clButton1 ist immernoch deine Membervar vom Typ CColorButton die zu deinem Button gehört.

    Was habe ich gemacht?

    Ich habe jetzt einfach eine Methode eingefügt, welche die Farbmembervariablen von der Klasse überschreibt und ihn bei einem Neuzeichnen dazu zwingt die geänderten Farbwerte zu benutzen. Mit SetWindowText() provoziere ich ein Neuzeichnen.

    *winke*
    Hellsgore

    EDIT: Jetzt zeichnet er sich selber, nach dem Aufruf von ChangeColor(), neu. Siehe CColorButton::RedrawWindow()


Anmelden zum Antworten