StatusBar einfärben
-
Hallo zusammen
Ich habe in einer StatusBar verschiedene Panels angelegt, und würde diese nun gerne mit verschiedenen Farben füllen, bzw in jedem Panel eine andere Textfarbe verwenden. Allerdings bekomme ich immer nur die gesamte StatusBar in einer Farbe. Ist dies überhaupt möglich???
Vielen Dank im vorraus.
MfG HK
-
void __fastcall TForm1::StatusBar1DrawPanel(TStatusBar *StatusBar, TStatusPanel *Panel, const TRect &Rect) { switch (Panel->Index) { case 0 : StatusBar1->Canvas->Brush->Color = clRed; break; case 1 : StatusBar1->Canvas->Brush->Color = clGreen; break; case 2 : StatusBar1->Canvas->Brush->Color = clBlue; break; } StatusBar1->Canvas->FillRect(Rect); StatusBar1->Canvas->TextOut(Rect.left + 2, Rect.top, Panel->Text); }
Die einzelnen Panels müssen natürlich alle auf psOwnerDraw stehen.
-
Hallo,
ich verwende den selben Code um eine Statusbar einzufärben.
Mir ist aufgefallen, dass die einzelnen Panels noch eine Art Rahmen haben, der nicht übermalt wird. Dies macht sich vorallem zwischen den Panels bemerkbar und stört mich.
Ich habe bereits die Bevel-Eigenschaft der Panels verändert, was aber auch nicht zum Erfolg geführt hat. Es spielt auch keine Rolle, ob ich die Panels einzeln einfärbe oder die gesamte Statusbar.
Könnte es sein, dass ich keinen Einfluss darauf habe, wie zwischen und um die Panels gezeichnet wird?
Gruß
Kerem
-
Hallo @Kerem,
der Knackpunkt ist die vorgegebene Größe des jeweilige Panel. Der Top-Wert ist nicht 0 und der Left-Wert auch nich.
Zudem zeichnet das Canvas der StatusBar nach "eigenen Gesetzen".
Selbst wenn wir im Rect Top und Left auf 0-Wert setzen, greift's nicht.
Also ein eigenes Canvas her; das Handle ist der DC vom Fenster-Handle der StatusBar (wie üblich).
Der Code von Jansen kann wie folgt modifiziert werden:void __fastcall TForm1::StatusBar1DrawPanel(TStatusBar *StatusBar, TStatusPanel *Panel, const TRect &Rect) { TCanvas * cv = new TCanvas(); cv->Handle = GetDC(StatusBar1->Handle); TRect rc = Rect; // neues Rect erstellen und modifizieren rc.left -= 2; rc.top = 0; rc.right +=2; switch (Panel->Index) { case 0 : cv->Brush->Color = clRed; break; case 1 : cv->Brush->Color = clGreen; break; case 2 : cv->Brush->Color = clBlue; break; } cv->FillRect(rc); cv->TextOut(rc.left + 2, rc.top+2, Panel->Text); delete cv; }
mfg
-
Vielen Dank