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.aspVielleicht 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); } }
-
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.