Textfarbe einer Combobox ändern



  • Hallo, estartu_de

    in Fancy control gibt es ein Beispiel, wie man Checkbox inaktiv setzen kann. Mit EnableEditing wird interne Variable auf false oder true gesetzt und click wird abgefangen. Damit wird checkbox nicht anklickbar sein. Das weiße hintergrund in radiobutton und checkbox bleibt aber. (was ich aber sehr irritierend für Anwender finde) Es hängt wahrscheinlich an Windows. Wenn du aber EnableWindow ansetzt werden interne Funktionen von Windows wider aktive und Schrift Änderung nicht möglich. Ich habe nur herausgefunden das die Hintergrundfarbe nur mit SetSystem bei Button geändert werden kann, was eigentlich die gute Nachricht sein sollte, aber die Funktion ändert nicht nur die Hintergrundfarbe von einem checkbox sondern von allen radiobutton und button dazu und nicht nur in deinem Programm, sondern in ganzem System. Also kann ich dir leider nicht weiter helfen.

    Als Quick und Dirty Lösung kann ich nur vorschlagen, checkbox so klein wie möglich machen, so dass man nur Rechteck sieht und daneben ein Static Text Feld platzieren, damit beleibt denn Text immer. Ist nicht elegant, aber funktioniert. Wenn du etwas herausfindest poste bitte, es wird auch mich interessieren.

    MfG

    Alex



  • Hallo Du!

    Du beschreibst, wie das für eine Checkbox (also ein Häkchen) geht. Okay, das hätte ich dann auch noch gebraucht. 🙂
    Aber momentan suche ich nach einer Lösung für Comboboxen, also Klapplisten. Davon habe ich nämlich deutlich mehr.

    Hast du da auch eine Idee?



  • Sorry, ich war warscheinlich zu tief in meinen Gedanken. 🙂

    Was Comboboxen angeht, fuktioniert es wunderbar mit Fancy Controls

    z.B.

    CHMXComboBox	m_Combo;
    

    und jetzt kannst du das ganze steuern

    m_Combo.SetBkClr(GetSysColor(COLOR_INACTIVEBORDER));
    	m_Combo.EnableEditing(FALSE);
    	m_Combo.SetCurSel(0);
    

    und schon hast du es.

    Du kannst deine eigene Klasse ableiten, wie es in Beispiel gemacht wurde, um nicht alles zu übernehmen.

    Wenn du zufällig mit checkboxen wissen wurdest poste im board, habe ich nämlich damit ein großeres Problem. 😞

    MfG

    Alex



  • Jaaaaaa, es funktioniert! Was lange währt wird endlich gut. 🙂
    Vielen, vielen Dank! 👍

    Nun muss ich das noch mit meiner eigenen Klasse verhäkeln und dann passt das. 😃



  • Fertig mit Häkeln! 🙂 *keksfreu*

    Man nehme:
    im Header:

    class CAdCbx : public CComboBox
    {
    // Konstruktion
    public:
    	CAdCbx();
    	BOOL EnableWindow(BOOL bEnable = TRUE);
    // Attribute
    protected:
    	bool m_bEnableEditing;
    	CBrush m_brsBkGnd;
    
    // Überschreibungen
    	// Vom Klassen-Assistenten generierte virtuelle Funktionsüberschreibungen
    	//{{AFX_VIRTUAL(CAdCbx)
    	//}}AFX_VIRTUAL
    
    // Implementierung
    public:
    	virtual ~CAdCbx();
    
    	// Generierte Nachrichtenzuordnungsfunktionen
    protected:
    	//{{AFX_MSG(CAdCbx)
    	afx_msg HBRUSH CtlColor(CDC* pDC, UINT nCtlColor);
    	afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
    	//}}AFX_MSG
    	virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);
    	bool EnableEditing(bool bEnableEditing = true);
    };
    

    im Cpp:

    CAdCbx::CAdCbx()
    	: m_bEnableEditing(true)
    {
    }
    
    CAdCbx::~CAdCbx()
    {
    	m_brsBkGnd.DeleteObject();
    }
    
    BEGIN_MESSAGE_MAP(CAdCbx, CComboBox)
    	//{{AFX_MSG_MAP(CAdCbx)
    	ON_WM_CTLCOLOR_REFLECT()
    	ON_WM_CTLCOLOR()
    	//}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    
    bool CAdCbx::EnableEditing(bool bEnableEditing)
    {
    	m_bEnableEditing = bEnableEditing;
    
    	if (m_bEnableEditing) 
    	{
    		m_brsBkGnd.DeleteObject();
    		m_brsBkGnd.CreateSolidBrush(GetSysColor(COLOR_WINDOW));
    	}
    	else
    	{
    		m_brsBkGnd.DeleteObject();
    		m_brsBkGnd.CreateSolidBrush(GetSysColor(COLOR_BTNFACE));
    	}
    	Invalidate();
    
    	return true;
    }
    
    LRESULT CAdCbx::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
    {
    	// TODO: Add your specialized code here and/or call the base class
    	if( !m_bEnableEditing )
    		if( message == WM_LBUTTONDOWN || message == WM_LBUTTONDBLCLK || message == WM_KEYDOWN || message == WM_VKEYTOITEM )
    			return FALSE;
    
    	return CComboBox::WindowProc(message, wParam, lParam);
    }
    
    HBRUSH CAdCbx::CtlColor(CDC* pDC, UINT nCtlColor) 
    {
    	// TODO: Change any attributes of the DC here
    	pDC->SetTextColor(RGB(0,0,0));
    	if (m_bEnableEditing) 
    	{
    		pDC->SetBkColor(GetSysColor(COLOR_WINDOW));
    	}
    	else
    	{
    		pDC->SetBkColor(GetSysColor(COLOR_BTNFACE));
    	}
    
    	// TODO: Return a non-NULL brush if the parent's handler should not be called
    	return (HBRUSH)m_brsBkGnd;
    }
    
    HBRUSH CAdCbx::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
    {
    	// TODO: Change any attributes of the DC here
    	pDC->SetTextColor(RGB(0,0,0));
    	if (m_bEnableEditing) 
    	{
    		pDC->SetBkColor(GetSysColor(COLOR_WINDOW));
    	}
    	else
    	{
    		pDC->SetBkColor(GetSysColor(COLOR_BTNFACE));
    	}
    
    	// TODO: Return a different brush if the default is not desired
    	return (HBRUSH)m_brsBkGnd;
    }
    
    BOOL CAdCbx::EnableWindow(BOOL bEnable)
    {
    	return EnableEditing(bEnable == TRUE);
    }
    

    Nun wird bei EnableWindow einfach nur der Hintergrund geändert und bei "deaktiviert" reagiert es nicht auf klicks. 😃

    So, ich hoffe ich habe nichts vergessen. 🙂


Anmelden zum Antworten