Statusbar farbig oder Gradient



  • kurz: suche eine beispiel für eine farbige Statusbar oder noch besser mit Gradient
    danke!!!



  • Ganz einfach: OwnerDrawn!



  • event. ist das falsch vestanden worden, ich will die ganze statusbar einfärben.



  • Schau mal hier, vielleicht passt etwas zu Deinem Geschmack:
    http://www.codeproject.com/statusbar/



  • da habe ich als erstes nachgeschaut, es gibt massig sachen wie man den inhalt der bar erweitern und verändern kann, aber nicht die statusbar selbst.



  • Schau mal bei FooBar nach. Dort wird der Button mit "Gradient" ausgestattet:
    http://www.codeproject.com/buttonctrl/FooButton.asp

    Vielleicht lässt sich das irgendwie übertragen. 😕

    //! Draws a gradient rectangle.
    void FooButton::drawGradientRect
      (CDC *pDC, CRect r,
       COLORREF cLeft,
       COLORREF cRight, BOOL bVertical)
    {
      // Use GradientFill function from MSIMG32.dll if possible
      if (m_dllGradientFillFunc != NULL) {
    
    		  TRIVERTEX rcVertex[2];
    		  rcVertex[0].x = r.left;
    		  rcVertex[0].y = r.top;
    		  rcVertex[0].Red = (unsigned short) (GetRValue (cLeft) << 8);
    		  rcVertex[0].Green = (unsigned short) (GetGValue (cLeft) << 8);
    		  rcVertex[0].Blue = (unsigned short) (GetBValue (cLeft) << 8);
    		  rcVertex[0].Alpha = 0;
    
    		  rcVertex[1].x = r.right;
    		  rcVertex[1].y = r.bottom;
    		  rcVertex[1].Red = (unsigned short) (GetRValue (cRight) << 8);
    		  rcVertex[1].Green = (unsigned short) (GetGValue (cRight) << 8);
    		  rcVertex[1].Blue = (unsigned short) (GetBValue (cRight) << 8);
    		  rcVertex[1].Alpha = 0;
    
    		  GRADIENT_RECT gRect;
    		  gRect.UpperLeft = 0;
    		  gRect.LowerRight = 1;
    
    		  // fill the area 
    		  m_dllGradientFillFunc
            (*pDC, rcVertex, 2, &gRect, 1,
             bVertical ? GRADIENT_FILL_RECT_V : GRADIENT_FILL_RECT_H);
    
          return;
      }
    
      // Otherwise, do a manual gradient fill
    	CRect stepR;					// rectangle for color's band
    	COLORREF color;				// color for the bands
    	float fStep;
    
    	if(bVertical)
    		fStep = ((float)r.Height())/255.0f;	
    	else
    		fStep = ((float)r.Width())/255.0f;	// width of color's band
    
    	for (int iOnBand = 0; iOnBand < 255; iOnBand++) 
    	{
    		// set current band
    		if(bVertical)
    		{
    			SetRect(&stepR,
    				r.left, 
    				r.top+(int)(iOnBand * fStep),
    				r.right, 
    				r.top+(int)((iOnBand+1)* fStep));	
    		}
    		else
    		{
    			SetRect(&stepR,
    				r.left+(int)(iOnBand * fStep), 
    				r.top,
    				r.left+(int)((iOnBand+1)* fStep), 
    				r.bottom);	
    		}
    
    		// set current color
    		color = RGB((GetRValue(cRight)-GetRValue(cLeft))*((float)iOnBand)/255.0f+GetRValue(cLeft),
    			(GetGValue(cRight)-GetGValue(cLeft))*((float)iOnBand)/255.0f+GetGValue(cLeft),
    			(GetBValue(cRight)-GetBValue(cLeft))*((float)iOnBand)/255.0f+GetBValue(cLeft));
    		// fill current band
    		pDC->FillSolidRect(stepR,color);
    	}
    }
    

  • Administrator

    Ich hab grad mal ein wenig rumgetestet ^^

    Also du leitest dir eine Klasse von CStatusBar ab, und überschreibst dir die DrawItem Funktion. Dort drin wirst du alles selber zeichnen müssen, auch den Text und co, bekommst aber alle nötigen Infos über das mitgelieferte Struct.

    Das sieht dann je nach dem vielleicht so aus:

    void COwnStatusBar::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
    {
        CDC dc;
        dc.Attach(lpDrawItemStruct->hDC);
        dc.SetBkColor(RGB(255,150,0));
        dc.FillSolidRect(&lpDrawItemStruct->rcItem, RGB(255,150,0));
        dc.DrawText(GetPaneText(lpDrawItemStruct->itemID), &lpDrawItemStruct->rcItem, DT_SINGLELINE | DT_NOPREFIX | DT_BOTTOM | DT_RIGHT);
        dc.Detach();
    }
    

    Nach dem Create und dem SetInidcators in der Mainframe fügst du dann noch folgendes dazu:

    for(int i = 0; i < m_wndStatusBar.GetCount(); i++)
    { m_wndStatusBar.SetPaneStyle(i, GetPaneStyle(i) | SBT_OWNERDRAW); }
    
    HBRUSH HBrush = CreateSolidBrush(RGB(255,150,0));
    SetClassLong(m_wndStatusBar.m_hWnd, GCL_HBRBACKGROUND, (LONG)HBrush);
    

    Das ist zwar alles noch kein Gradient aber immerhin kann man so die eigene Hintergrundfarbe hinkriegen. Geht vielleicht alles noch besser, habe ich jetzt nur so in 1 - 2 Stunden herausdividiert ^^

    Grüssli



  • Danke Erhard Henkes,
    die bar ist zwar jetzt Gradient gefüllt, aber nur der Hintergrund.
    ID_SEPARATOR ID_INDICATOR_CAPS, ID_INDICATOR_NUM und ID_INDICATOR_SCRL haben immer noch einen grauen Hintergrund. Würde die auch mal event. mit einer anderen Farbe darstellen. oder transparent machen.
    PS mir ist auch grade aufgefallen, dass es 2 Verschiedene StatusBars gibt, vom Layout her. bei der einen hat man rechts für die Änderung der Größe Punke, bei der anderen Striche, wodurch kommt es?



  • danke Dravere, ich hab das mit Gradient schon geschafft. Das mit dem Layout hat sich auch erledigt.
    Jetzt nur noch einen Ramen um die einzelenen einträge, dann ist es fertig.



  • Das mit dem Rahmen und die Einträge ist schwieriger als ich dacht habe.
    Ich kann irgendwie die Einträge nur den einen Balken trennen, was sowieso schon drin ist, aber keine Rahmen um den Eintag machen.
    Hat da einer eine Idee?



  • Mach doch einfach die "manifest" Datei raus.


Anmelden zum Antworten