TabControl und Farbe



  • Wie kann ich die Fabe der Lasche eines Tabcontrols aendern?
    Mir ist klar das das nur ueber das OnDrawTab Ereignis geht.
    Allerdings weiss ich nicht wie.



  • Vielleicht sollte ich noch anfuegen das, wenn ich OwnerDraw auf true setze die Laschen automatisch die Farbe des Tabs annehmen.
    Allerdings ist dann schreiben nicht mehr.



  • Fuer ein PageControl habe ich ein DEMO.
    Dazu hab ich ne Komponente von TPageControl abgeleitet:

    //HEADER- DATEI
    
    class TColorPageControl : public TPageControl
    {
    __published:	// Von der IDE verwaltete Komponenten
    private:	// Anwenderdeklarationen
      virtual void __fastcall ShowControl(Controls::TControl* AControl);
    
      TColor FPageColor;
      TColor FTabColor;
      TColor FTabSheetColor;
      TColor FTabSheetBorderColor;
      virtual void __fastcall CreateParams(Controls::TCreateParams &Params);
      virtual void __fastcall PaintWindow(HDC DC);
      virtual void __fastcall DrawTab(int TabIndex, const Windows::TRect &Rect, bool Active);
    
      void __fastcall SetPageColor(TColor C);
      void __fastcall SetTabColor(TColor C);
      void __fastcall SetTabSheetColor(TColor C);
      void __fastcall SetTabSheetBorderColor(TColor C);
    public:		// Anwenderdeklarationen
            __fastcall TColorPageControl(TComponent* Owner);
    __published:
      __property TColor PageColor ={read=FPageColor, write=SetPageColor};
      __property TColor TabColor ={read=FTabColor, write=SetTabColor};
      __property TColor TabSheetColor ={read=FTabSheetColor, write=SetTabSheetColor};
      __property TColor TabSheetBorderColor ={read=FTabSheetBorderColor, write=SetTabSheetBorderColor};
    };
    //---------------------------------------------------------------------------
    
    //CPP- DATEI
    
    void __fastcall TColorPageControl::ShowControl(Controls::TControl* AControl)
    {
      TPageControl::ShowControl(AControl);
    }
    //---------------------------------------------------------------------------
    void __fastcall TColorPageControl::SetPageColor(TColor C)
    {
      FPageColor=C;
      Color=C;
      SetTabSheetBorderColor(C);
    //  Invalidate();
    }
    //---------------------------------------------------------------------------
    void __fastcall TColorPageControl::SetTabColor(TColor C)
    {
      FTabColor=C;
      Invalidate();
    }
    //---------------------------------------------------------------------------
    void __fastcall TColorPageControl::SetTabSheetColor(TColor C)
    {
      FTabSheetColor=C;
      Brush->Color=C;
      Invalidate();
    }
    //---------------------------------------------------------------------------
    void __fastcall TColorPageControl::SetTabSheetBorderColor(TColor C)
    {
      FTabSheetBorderColor=C;
      Invalidate();
    }
    //---------------------------------------------------------------------------
    __fastcall TColorPageControl::TColorPageControl(TComponent* Owner)
            : TPageControl(Owner)
    {
      FPageColor=clBtnFace;
      FTabColor=clBtnFace;
      FTabSheetColor=clBtnFace;
      Color=FTabSheetColor;
      Brush->Color=FPageColor;
      Canvas->Brush->Color=FTabColor;
    }
    //---------------------------------------------------------------------------
    void __fastcall TColorPageControl::CreateParams(Controls::TCreateParams &Params)
    {
      HBRUSH BR;
      TCustomTabControl::CreateParams(Params);
    /*
      BR=Params.WindowClass.hbrBackground;
      DeleteObject(BR);
      BR=GetStockObject(HOLLOW_BRUSH);
      Params.WindowClass.hbrBackground=BR;
    */
    }
    //---------------------------------------------------------------------------
    void __fastcall TColorPageControl::PaintWindow(HDC DC)
    {
      TRect R;
      R=DisplayRect;
      R.Left-=4;
      R.Top-=4;
      R.Right+=4;
      R.Bottom+=4;
      TCanvas *CV=new TCanvas;
      CV->Handle=DC;
      CV->Brush->Color=FTabSheetBorderColor;
      CV->FillRect(R);
      delete CV;
      if (OwnerDraw)
      {
        TPageControl::PaintWindow(DC);
      }
      else
      {
        TPageControl::PaintWindow(DC);
      }
    }
    //---------------------------------------------------------------------------
    void __fastcall TColorPageControl::DrawTab(int TabIndex, const Windows::TRect &Rect, bool Active)
    {
      //TPageControl::DrawTab(TabIndex,Rect,Active);
      Canvas->Brush->Color=FTabColor;
    //  Canvas->FillRect(Rect);
      Canvas->TextRect(Rect,
                    Rect.Left+(Rect.Width()-Canvas->TextWidth(Pages[TabIndex]->Caption)) / 2,
                    Rect.Top+(Rect.Height()-Canvas->TextHeight(Pages[TabIndex]->Caption)) / 2,
                    Pages[TabIndex]->Caption);
    }
    
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
      TTabSheet *TS;
      CPC=new TColorPageControl(this);
      CPC->Parent=this;
      TS=new TTabSheet(CPC);
      TS->PageControl=CPC;
      TS->Caption="T1";
      TS=new TTabSheet(CPC);
      TS->PageControl=CPC;
      TS->Caption="T2";
      TS=new TTabSheet(CPC);
      TS->PageControl=CPC;
      TS->Caption="T3";
      CPC->Left=50;
      CPC->Top=50;
      CPC->HotTrack=true;
    
      CPC->PageColor=clYellow;
      CPC->TabColor=clRed;
      CPC->TabSheetColor=clBlue;
      CPC->TabSheetBorderColor=clGreen;
      CPC->OwnerDraw=OD->Checked;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::FormDestroy(TObject *Sender)
    {
      delete CPC;
    }
    //---------------------------------------------------------------------------
    

    Vielleicht hilft das etwas. 😉



  • Ich werde mich mal durchbeissen.
    Danke fuer deine Antwort.



  • So habe ich es gelöst (PrgFarbe ist ein Integerwert für den Hintergrund z.B. clBtnFace):

    void __fastcall TForm1::frm1_tabReiterDrawTab(TCustomTabControl *Control, int TabIndex, const TRect &ARect, bool Active)
    {try {                                                                          // Fehlerroutine Start
     AnsiString z1; TColor f1,f2;                                                   // Vars definieren
     TTabSheet *PTab;                                                               // TabControl anlegen
     TCanvas *ACanvas;                                                              // Canvas vorbereiten
     TRect CRect;                                                                   // Rect vorbereiten
    
     CRect=ARect;                                                                   // Akt. Rect übergeben
    
     PTab   =frm1_tabReiter->Pages[TabIndex];                                       // Reiter als Control übergeben
     ACanvas=Control->Canvas;                                                       // Canvas übergeben
     z1     =PTab->Caption;                                                         // Text im Reiter
    
     f1=PrgFarbe;                                                                   // HG Farbe Standard
     f2=clBtnText;                                                                  // VG Farbe Standard
    
     if(Active==true) {                                                             // REITER IST AKTIV
      f1=clBtnHighlight; f2=clBlack;                                                // Voreinstellung
      switch(TabIndex) {                                                            // welcher Reiter?
      case 1: f1=clGreen;   f2=clWhite;       break;                                // PLAN
      case 2: f1=clMaroon;  f2=clWhite;       break;                                // SCHRANK
      case 3: f1=clNavy;    f2=clWhite;       break;                                // AUFTRÄGE
      case 4: f1=clYellow;  f2=clBlack;       break;                                // BEMERKUNG
      case 5: f1=clFuchsia; f2=clBlack;       break;                                // ZUSTÄNDIG
      case 6: f1=clOlive;   f2=clWhite;       break;                                // ZUBEHÖR
      case 7: f1=clGray;    f2=clWhite;       break;                                // HISTORIE
      case 8: f1=clRed;     f2=clWhite;       break;                                // DATEIEN
      }                                                                             // ende switch(TabIndex
     }                                                                              // ende if(Active
    
     ACanvas->Brush->Color=f1;                                                      // Farbe HG festlegen
     ACanvas->Font->Color =f2;                                                      // Farbe VG festlegen
    
     ACanvas->Font->Name="Arial"; ACanvas->Font->Size=8;                            // Schrift anpassen
     ACanvas->FillRect(CRect);                                                      // Fläche erst füllen
     DrawText(ACanvas->Handle,z1.c_str(),-1,&CRect,DT_CENTER | DT_VCENTER | DT_SINGLELINE); // Text schreiben
    
     } catch(Exception& e) { MessageBox(NULL, e.Message.c_str(), "TForm1::frm1_tabReiterDrawTab()", MB_OK); }  // Fehler anzeigen
    }
    

    Gruss Stefan


Anmelden zum Antworten