TPageControl, Tabs mit unterschiedlichen Farben beschriften

Rund um die LCL und andere Komponenten
Antworten
Geronimo
Beiträge: 24
Registriert: Sa 1. Feb 2025, 23:22
OS, Lazarus, FPC: Winux (L 3.6.0 FPC 3.2.2)
CPU-Target: 64Bit
Wohnort: Hamburg

TPageControl, Tabs mit unterschiedlichen Farben beschriften

Beitrag von Geronimo »

Moin,

ich möchte ein PageControl verwenden, das
  • MultiLine
  • und Tabs mit unterschiedlichen Farben beschriften
kann.

Theoretisch sollte das TcyPageControl das können, aber irgendwie hat TcyPageControl
Probleme bei MultiLine alles richtig darzustellen (Bei Delphi ging's noch. :( )

Ähnliche Themen wurde schon oft diskutiert, z.B. hier: viewtopic.php?p=121876#p121876.
Hier kann man dann auch die Beschriftung ergänzen:

Code: Alles auswählen

procedure TPageControl.CNDrawitem(var Message: TWMDrawItem);
var
  Rect: TRect;
  Can: TCanvas;
begin
  Rect := Message.DrawItemStruct^.rcItem;
  InflateRect(Rect, -4, -4);

  try
    can := TCanvas.Create;
    can.Handle := Message.DrawItemStruct^.hDC;

    //Schriftfarbe von TTabSheet.Font verwenden
    can.Font.Color:= Pages[Message.DrawItemStruct^.itemID].Font.Color;

    //Aktives Sheet -> fett
    if Message.DrawItemStruct^.itemState = ODS_SELECTED then
      can.Font.Style:= [fsBold]
    else
      can.Font.Style:= [];

    can.Brush.Style := bsClear;
    can.TextOut(Rect.Left, Rect.Top,PChar(Pages[Message.DrawItemStruct^.itemID].Caption));

  finally
    can.Free;
  end;
  Message.Result := 1;
  inherited;
end;        
Das ist jetzt wieder windoof-spezifischer Kram.
Geht das ohne?
Dann könnte es eventuell auch auf anderen Plattformen funktionieren!


Gern auch Vorschläge für eine andere PageControl-Kompo.

Gruß
Geronimo
Die Welt ist linear, rechteckig und gaussverteilt.

Benutzeravatar
h-elsner
Lazarusforum e. V.
Beiträge: 282
Registriert: Di 24. Jul 2012, 15:42
OS, Lazarus, FPC: LINUX Mint21.1, Win10, Lazarus 2.2.4, FPC3.2.2
CPU-Target: X86-64; arm 32bit
Wohnort: Illertissen
Kontaktdaten:

Re: TPageControl, Tabs mit unterschiedlichen Farben beschriften

Beitrag von h-elsner »

Unter LINUX zumindest geht bei mir so ein Konstrukt:
tsTabsheetTest.Caption:='Erste Zeile'+lineending+'zweite Zeile';
Bei Windows habe ich das noch nicht getestet.

Farbige Beschriftung ist eine andere Frage, wenn man nicht gleich alle Texte im TabSheet in dieser Farbe haben will.

Geronimo
Beiträge: 24
Registriert: Sa 1. Feb 2025, 23:22
OS, Lazarus, FPC: Winux (L 3.6.0 FPC 3.2.2)
CPU-Target: 64Bit
Wohnort: Hamburg

Re: TPageControl, Tabs mit unterschiedlichen Farben beschriften

Beitrag von Geronimo »

Geronimo hat geschrieben: So 23. Feb 2025, 22:05 Moin,

ich möchte ein PageControl verwenden, das
  • MultiLine
  • und Tabs mit unterschiedlichen Farben beschriften
kann.

Theoretisch sollte das TcyPageControl das können, aber irgendwie hat TcyPageControl
Probleme bei MultiLine alles richtig darzustellen (Bei Delphi ging's noch. :( )

Ähnliche Themen wurde schon oft diskutiert, z.B. hier: viewtopic.php?p=121876#p121876.
Hier kann man dann auch die Beschriftung ergänzen:

Code: Alles auswählen

procedure TPageControl.CNDrawitem(var Message: TWMDrawItem);
var
  Rect: TRect;
  Can: TCanvas;
begin
  Rect := Message.DrawItemStruct^.rcItem;
  InflateRect(Rect, -4, -4);

  try
    can := TCanvas.Create;
    can.Handle := Message.DrawItemStruct^.hDC;

    //Schriftfarbe von TTabSheet.Font verwenden
    can.Font.Color:= Pages[Message.DrawItemStruct^.itemID].Font.Color;

    //Aktives Sheet -> fett
    if Message.DrawItemStruct^.itemState = ODS_SELECTED then
      can.Font.Style:= [fsBold]
    else
      can.Font.Style:= [];

    can.Brush.Style := bsClear;
    can.TextOut(Rect.Left, Rect.Top,PChar(Pages[Message.DrawItemStruct^.itemID].Caption));

  finally
    can.Free;
  end;
  Message.Result := 1;
  inherited;
end;        
Nachtrag: OwnerDraw des PageControl muss natürlich auf true gesetzt werden.

Das ist jetzt wieder windoof-spezifischer Kram.
Geht das ohne?
Dann könnte es eventuell auch auf anderen Plattformen funktionieren!


Gern auch Vorschläge für eine andere PageControl-Kompo.

Gruß
Geronimo
Die Welt ist linear, rechteckig und gaussverteilt.

Geronimo
Beiträge: 24
Registriert: Sa 1. Feb 2025, 23:22
OS, Lazarus, FPC: Winux (L 3.6.0 FPC 3.2.2)
CPU-Target: 64Bit
Wohnort: Hamburg

Re: TPageControl, Tabs mit unterschiedlichen Farben beschriften

Beitrag von Geronimo »

@ h-elsner

Das Problem ist nicht das TabSheet, sondern das PageControl, welches eigenmächtig die Caption des TabSheet bei sich, z.B. in Form von Tabs,
darstellt, ohne dass ich auf der LCL-Ebene eine Chance hätte, auf die Darstellung Einfluss zu nehmen.

Sauber wäre, z.B.:

Code: Alles auswählen

APageControl.OwnerDraw := true;
und ein passendes Event mit Canvas, Rect usw.

Die OwnerDraw-Eigenschaft gibt es wohl, aber kein passendes Event dazu:
Die Hilfe sagt zu dem Thema:
OwnerDraw is a Boolean property. Its value is read from and written to the corresponding property in Tabs. In widgetset classes, it affects the style flags for a tab - but is not used in the current LCL version or its widgetsets.
Die Welt ist linear, rechteckig und gaussverteilt.

Antworten