Button einfärben?

So ganz verstehe ich deine Frage nicht. Für jeden Button brauchst du ein eigenes Bitmap (hast du ja bereits gemacht). Wird das Bitmap zerstört ist natürlich auch die Farbe weg. Hast du jetzt eigentlich noch mehrere Buttons oder nur noch einen mit dem Popup-Menü? Ist doch prima, wenn es jetzt funktioniert?
Also ich bin dabei zu lernen.(hast Du ja sicher bemerkt). Deshalb wird Dir manches unbeholfen vorkommen. Wenn man eine gerade Sprache (eins nach dem anderen) kann, ist manches nicht nachvollziehbar. Obwohl hier sicher auch eins nach dem anderen geht, nur sind Sachen dazwischen, die Vorrang haben.
Wird das Bitmap zerstört ist natürlich auch die Farbe weg.
Ist eben nicht immer so wie ich oben erklärt habe. Dann würde ich das verstehen.

Das ganze wird die Farbauswahl für einen Editor. Button für Kommentare; Zahlen; Funktionen etc. (gibts zu Hauf, ich weis)
Es wird zwar nicht vorkommen, aber es könnte ja passieren, das einer damit rumspielt. Und da habe ich von Dir gelernt, daß dann Leichen im Keller sind wenn man nicht aufpasst.
Hätte es mir leicht machen können und statt des Buttons ein Editfenster nehmen können. Nur ich will ja auch lernen, und geht nicht, kann ich nicht leicht akzeptieren.

So, wie ich dich verstanden habe würde bei jeder Auswahl einer anderen Farbe ein neues Object angelegt. Ich färbe den Button dann damit. Also muß ich mit meinem kleinen Verstand versuchen das zu verhindern. Glaube ich habe es geschafft. es gibt jetzt keine allgemeine Variable mehr für die Bitmaps, jetzt für jeden Button eine. Bei OK oder Cancel verden die zerstört. UND wenn eine neue Farbe für den Button ausgewählt wird, wird vorher das alte zerstört.
Für solche Aufgaben gibt's übrigens einen Windows-Standarddialog. Schaue dir mal die Klasse CColorDialog an. Zumindest dein Popup-Menü könntest du damit ersetzen und würdest dir damit das Hantieren mit irgendwelchen Farbtabellen ersparen.

Das hat auch mit meiner Lernerei zu tun. Das Auswahlfenster kenne ich. Gefiel mir für den Fall aber nicht und so habe ich mir das angeeignet und einiges über Pupup gelernt.

Gruß Robert
 
Wenn die Farbe trotz Löschen des Bitmaps nicht verschwindet ist der Vorgang vermutlich doch nicht richtig ausgeführt worden oder aber der Button wurde noch nicht wieder neu gezeichnet.

Es ist sehr empfehlenswert, für die colorierten Button eine eigene Klasse anzulegen. Damit kann man alle Methoden und Datenstrukturen zum Einfärben gut kapseln und das Aufräumen gestaltet sich damit sehr viel übersichtlicher.

.h-Datei:
Code:
#ifndef _CCOLOREDBUTTON_H_
#define _CCOLOREDBUTTON_H_

class CColoredButton : public CButton
{
public:
    CColoredButton();
    ~CColoredButton();

    void SetColor(COLORREF crColor);

private:
    HBITMAP CreateColoredBitmap(UINT uiWidth, UINT uiHeight, COLORREF crColor);

    HBITMAP m_hbmButtonSkin;
};

#endif
.cpp-Datei:
Code:
CColoredButton::CColoredButton()
{
    m_hbmButtonSkin = NULL;
}

CColoredButton::~CColoredButton()
{
    if( m_hbmButtonSkin )
    {
        ::DeleteObject(m_hbmButtonSkin);
    }
}

void CColoredButton::SetColor(COLORREF crColor)
{
    if( m_hbmButtonSkin )
    {
        ::DeleteObject(m_hbmButtonSkin);
        m_hbmButtonSkin = NULL;
    }

    CRect rect;
    GetClientRect(&rect);

    m_hbmButtonSkin = CreateColoredBitmap(rect.Width(), rect.Height(), crColor);

    if( m_hbmButtonSkin )
    {
        SetBitmap(m_hbmButtonSkin);
    }
}

HBITMAP CColoredButton::CreateColoredBitmap(UINT uiWidth, UINT uiHeight, COLORREF crColor)
{
    // ... Code wie bereits gepostet
}
 
Da das manchmal passiert, vermute ich daß es am Neuzeichnen liegt. Das mit der Klasse werde ich machen. Fange an mich in die Klassen zu verlieben.
Habe auch eine Seite gefunden. Die hat aber nicht viel mit Hintergrund zu tun.

Achja mit den Klassen: Habe früher viel mit FoxPro programmiert, Dort habe ich mir auch meine eigenen Klassen gemacht. Wenn ich den Dialog bearbeitete hatte ich die dann in einem kleinen Fenster zur Verfügung und konnte sie auf den Dialog platzieren. Bin überzeugt, das gibt es auch in VC++. Aber trotz intensiver Suche hab ich das nicht gefunden. Daher muß ich eigene Klassen im Script per Hand einfügen.

Hast du einen Hinweis wo ich da nachlesen muß?


Gruß Robert
 
Mit FoxPro habe ich auch mal einige Jahre programmiert, ist allerdings schon ziemliche lange her und da ist schon vieles verblasst. :D

In ein Dialogtemplate kannst du direkt erstmal nur die Windows-Basiscontrols oder ActiveX-Controls einfügen. So komfortabel, wie im FoxPro-Dialogeditor geht's hier bei weitem nicht zu, u.a. auch weil es technisch ganz anders funktioniert. Die Verbindung mit von dir erstellten oder den MFC-Klassen erfolgt später.
Der einfachste Weg besteht darin, eine Member-Variable zum betreffenden Control anzulegen. Wenn in deinem Projekt von der jeweiligen Basisklasse abgeleitete Klassen existieren (und der Klassenassistent diese auch kennt; damit gibt's manchmal Probleme), kannst du die an dieser Stelle direkt auswählen. Ansonsten einfach im Dialogheader z.B. "CButton m_mybutton" durch "CNewButton m_mybutton" ersetzen.

Grüße
Matthias
 

Neue Beiträge

Zurück