Aussehen eines Buttons bei Focuserhalt ändern



  • Hallo.

    Ich beschäftige mich derzeit mit Buttons. Bei der Suche im Forum hab ich zwei Threads über das Einfärben gefunden.
    Allerdings möchte ich den Button nur einfärben, wenn er den Focus erhalten hat, da er sich etwas abheben sollte. Ansonsten soll der ganz normal aussehen. Es würde auch reichen wenn der gestrichelte Rahmen bei Focuserhalt sich vom Rest etwas abheben könnte (z.B. auch farbig wäre). Allerdings weiß ich nicht wie man das bewerkstelligt.
    Ich habe schon eine Klasse von CButton abgeleitet und die DrawItem überschrieben. Allerdings hab ich es dort nur geschafft die Textfarbe zu ändern. Ich denke aber schon das dort anzusetzen ist. Weiß da jemand drüber Bescheid?



  • Hier mal mein Owner Drawn Button - so weit ich ihn gemacht habe:

    void CMyButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) 
    {
    	CDC dc;
    	dc.Attach(lpDrawItemStruct->hDC);		//Device Context zuweisen
    	CRect rect;
    	rect = lpDrawItemStruct->rcItem;		//Rechteck des Buttons
    	dc.FillSolidRect(rect, GetSysColor(COLOR_BTNFACE));	//Gefülltes Rechteck in den Button zeichnen
    
    	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();	
    }
    

    bis auf die Tatsache das er nicht als StandartButton genommen werden kann reagiert er wie ein normaler button (also reagiert nicht auf Return).

    Wenn du das etwas änderst dürfte es das sein was du haben willst

    EDIT: mh damn, is wohl die alte version, er wird beim anklicken halt nicht "reingedrückt", hab die version die das konnte wohl gelöscht 😛



  • Hmmm, mein Problem ist aber genau die Reaktion auf <Return>. Das Programm soll eine Maschine steuern wo der Anwender nur mit Enter weiterdrücken muss. Maus soll nur im "Notfall" verwendet werden.



  • dann bringts dir nix DrawItem zu überschreiben, in dem moment verliert der Button die eigenschaft eine Standart Buttons

    schau mal bei CodeGuru oder CodeProject irgendwo hab ich mal was gesehen wie man Owner Drawn Buttons auch mit Enter erreichen kann. War mir damals aber zu kompliziert/als das ich lust gehabt hätte mir das anzuschaun

    vielleicht haben die das hier sogar schon gelöst:
    http://www.codeguru.com/Cpp/controls/buttonctrl/article.php/c5169



  • Taelan schrieb:

    dann bringts dir nix DrawItem zu überschreiben, in dem moment verliert der Button die eigenschaft eine stan**** Buttons

    schau mal bei CodeGuru oder CodeProject irgendwo hab ich mal was gesehen wie man Owner Drawn Buttons auch mit Enter erreichen kann. War mir damals aber zu kompliziert/als das ich lust gehabt hätte mir das anzuschaun

    vielleicht haben die das hier sogar schon gelöst:
    http://www.codeguru.com/Cpp/controls/buttonctrl/article.php/c5169

    Das Projekt hinter Deinem Link kenne ich bereits, es kann aber leider auch nicht mit Enter umgehen. Im übrigen gibts da noch eins mit der gleichen Funktionalität. Ich hab auch nochmal gegoogelt aber nix gefunden. Werde wohl damit leben müssen.


Anmelden zum Antworten