Frage zu CTLCOLOR



  • Also ich möchte die Hintergrundfarbe eines Buttons ändern und habe folgendes bisher gemacht:

    HBRUSH CPicEditorDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
    {
    	HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);	
    
    	//Colorbutton die entsprechende Farbe zuweisen
    	if (m_colorButton.m_hWnd == pWnd->m_hWnd)
    	{
    		CRect rect;
    		pWnd->GetClientRect(&rect);
    		CBrush brush;
    		brush.CreateSolidBrush(RGB(0,0,255));
    		pDC->Rectangle(&rect);
    
    		return ::CreateSolidBrush(RGB(0,0,50));
    	}
    
    	// TODO: Anderen Pinsel zurückgeben, falls Standard nicht verwendet werden soll
    	return hbr;	
    }
    

    Problem: es passiert nix, keine Änderung der Farbe, warum???
    pDC->SetBkColor(); bringt auch nix.



  • Mach mal einen Breakpoint in die if, ob der die Zeilen überhaupt ausführt. 🙂



  • hab ich schon der geht da rein wie ein Weltmeister
    aber trotzdem kommt es dauernd in der grauen Standardfarbe raus



  • Bei Buttons geht das nicht so einfach.



  • wie geht es denn bei Buttons?

    habs jetzt erstmal in der OnDraw des Dialoges, das ist aber auch doof, weil wenn man den Button drückt und dann außerhalb des Dialogs loslässt wird der ja nicht aktiviert und es kommt keine OnPaint-Nachricht sondern es wird nur das Steuerfeld gezeichnet.



  • Erstbester Beitrag bei Codeproject: http://www.codeproject.com/buttonctrl/colorbox.asp 🙂



  • Ich hab das jetzt mit Trick 17b gelöst, ich benutze keinen Button, sondern ein Static-Element, da hab ich zwar nicht die hübsche "Animation" des Reindrückens, aber da das bei mir nicht sooooo wichtig ist in dem Fall, macht das nix.

    CWnd* pColor = GetDlgItem(IDC_COLOR);
    if(pColor->m_hWnd == pWnd->m_hWnd)
    {		
    	//pDC->SetTextColor(m_color);
    	//pDC->SetBkColor(m_color);
    
    	return (HBRUSH)m_brush;
    }
    //
    pColor = GetDlgItem(IDC_COLOR2);
    if(pColor->m_hWnd == pWnd->m_hWnd)
    {		
    	//pDC->SetTextColor(m_color);
    	//pDC->SetBkColor(m_color);
    	return (HBRUSH)m_bkBrush;
    }
    
    return CDialogBar::OnCtlColor(pDC,pWnd,nCtlColor);
    

    Falls das Static-Element einen Text hat, damit man es im Ressourcen-Editor auch sieht. muss man wie zu sehen Textfarbe ud Texthintergrund auch entsprechend farblich anpassen, damit diese final verschwinden.

    Der Brush ist eine Membervariable der Klasse. Der darf NICHT lokal angelegt werden, das geht schief.



  • Du kannst den Button selbst zeichnen

    da kannst du ihn auch wie den StandartButton aussehen lassen wenn du lust hast

    ABER ! um ihn zu einem StandartButton zu machen musst du etwas trickreich sein. Bei CodeProject oder CodeGuru gibts da nen artikel dazu aber hab mir den noch nicht angetan
    (StandartButton = Mit Enter auslösbar)

    Hier mal so ein Quelltext:

    void CMyButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) 
    {
    	CDC dc;
    	dc.Attach(lpDrawItemStruct->hDC);		//Device Context zuweisen
    	CRect rect;
    	CRect rt;
    	rect = lpDrawItemStruct->rcItem;		//Rechteck des Buttons
          //Gefülltes Rechteck in den Button zeichnen
    	dc.FillSolidRect(rect, GetSysColor(COLOR_BTNFACE));
    
    	UINT state = lpDrawItemStruct->itemState; //Get state of the button
    	dc.SetTextColor(RGB(0,0,0));
                            // Set the color of the caption to be yellow
    	CString strTemp;
    	GetWindowText(strTemp);
    	                      // Get the caption which have been set
    	dc.DrawText(strTemp,rect,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
    	                             // Draw out the caption
    	if ( (state & ODS_SELECTED) )            // If it is pressed
    	{
    		 dc.DrawEdge(rect,EDGE_SUNKEN,BF_RECT);    // Draw a sunken face
    	}
    	else
    	{
    		dc.DrawEdge(rect,EDGE_RAISED,BF_RECT);    // Draw a raised face
    	}
    	if ( (state & ODS_FOCUS ) )       // If the button is focused
    	{
    		// Draw a focus rect which indicates the user
    		// that the button is focused
    		dc.SelectStockObject(HOLLOW_BRUSH);
    		dc.DrawEdge(rect,EDGE_RAISED,BF_RECT);
    		dc.Rectangle(rect);
    		int iChange = 4;
    		rect.top += iChange;
    		rect.left += iChange;
    		rect.right -= iChange;
    		rect.bottom -= iChange-1;
    		dc.DrawFocusRect(rect);
    	}
    	dc.Detach();	
    }
    

    mag sein das man das schöner machen kann aber ich hatte bisher noch nicht so viel zeit mich damit zu befassen.

    EDIT: Mhmh irgendwas fehlt an dem Code ich weiss grad nur nicht was ^^



  • Pellaeon schrieb:

    if(pColor->m_hWnd == pWnd->m_hWnd)
    {		
    	//pDC->SetTextColor(m_color);
    	//pDC->SetBkColor(m_color);
    
    	return (HBRUSH)m_brush;
    }
    

    Der Brush ist eine Membervariable der Klasse. Der darf NICHT lokal angelegt werden, das geht schief.

    Hab grad beim StaticElement das Problem, das nicht das ganze Element ausgefüllt wird, sondern nur der Text inkl. Hintergrund:

    pDC->SetTextColor(m_color);
    pDC->SetBkColor(m_color);
    

    Wie initialisiere ich den Brush und wie kann ich ihn zur Laufzeit ändern?

    Danke. 🙂

    <edit>
    Hab's hinbekommen 😃
    </edit>



  • für alle anderen^^

    m_brush.DeleteObject();
    m_brush.CreateSolidBrush(color);
    


  • Als hätt ich's abgeschrieben 😃
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-123215.html

    Grüsse,
    don_basto



  • *lol* ich habe mir für die Farbe aber eine extra Set-Methode geschrieben, sodass ich den Brush nicht immer wieder in der OnCtl neu erstellen muss.


Anmelden zum Antworten