TabSheet Color

Antworten
Benutzeravatar
Aidex
Beiträge: 60
Registriert: Do 24. Sep 2020, 07:02
OS, Lazarus, FPC: Win10 64bit, Laz v2.0.10
CPU-Target: AMD64

TabSheet Color

Beitrag von Aidex »

Moin!
Wenn ich in den Projekt-Einstellungen das Windows-Manifest aktiviere, werden TabSheets (in einem PageControl) mit weißem Hintergrund dargestellt, und nicht mit grauem Hintergrund wie ohne Manifest.
Das Weiß ist für mich aber sehr ungünstig (unbrauchbar), ich benötige eine weniger helle Hintergrundfarbe.

Auf das TabSheet setze ich ein Frame, das mittels ParentBackground:=False sogar eine eigene Farbe mitbringt, aber mit eingeschaltetem Manifest wird auf dem TabSheet auch die Frame-Farbe stur ignoriert und der Frame-Hintergrund erscheint weiß.

Für ein TabSheet scheint es auch kein OwnerDraw und OnPaint zu geben, oder?
Kennt jemand einen Trick für die TabSheet-Hintergrundfarbe?
Danke und Grüße, Jörg

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: TabSheet Color

Beitrag von Winni »

Hi!

Ich weiß nix von Manifest, aber der Trick geht unter Linux so:

Gibt der Form auf dem die PageControl und die Tasbsheets liegen eine Farbe.
Die Tabsheets nehmen automatisch die Farbe der Form an.

Vielleicht kommst Du ja mit diesem Tipp weiter.

Winni

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: TabSheet Color

Beitrag von Michl »

Eine einfache Lösung wäre ein TPanel auf dem TabSheet zu platzieren und auf diesem dann das Frame. Es bleibt dann aber ein weißer Rand und die Tabs selbst sind ebenfalls mit dem Windows Theme Color gefüllt.

Eine weitere Möglichkeit wäre OwnerDraw zu nutzen. Ich habe mal ein kleines Bsp. angehangen, wie es hier funktioniert (Windows only, Win7 Aero Theme getestet, HighDPI unaware!). Wenn du noch die Tabs farbig ändern oder du wissen willst, warum das bei dem TPageControl so ist, findest du weitere Infos hier https://stackoverflow.com/questions/182 ... owner-draw

Code: Alles auswählen

uses ... windows, LMessages...

type

  TPageControl = class(ComCtrls.TPageControl)
  public
    procedure CNDrawitem(var Message: TWMDrawItem); message LM_DRAWITEM;
  end;
...
procedure TPageControl.CNDrawitem(var Message: TWMDrawItem);
var
  Rect: TRect;
begin
  Rect := Message.DrawItemStruct^.rcItem;
  InflateRect(Rect, -4, -4);
  TextOut(Message.DrawItemStruct^.hDC, Rect.Left, Rect.Top,
          PChar(Pages[Message.DrawItemStruct^.itemID].Caption),
          Length(Pages[Message.DrawItemStruct^.itemID].Caption));
  Message.Result := 1;
  inherited;
end;
...
procedure TForm1.FormCreate(Sender: TObject);
begin
  PageControl1.OwnerDraw := True;
end;  
Dateianhänge
PageControl_Test.zip
(2.69 KiB) 164-mal heruntergeladen

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Benutzeravatar
Aidex
Beiträge: 60
Registriert: Do 24. Sep 2020, 07:02
OS, Lazarus, FPC: Win10 64bit, Laz v2.0.10
CPU-Target: AMD64

Re: TabSheet Color

Beitrag von Aidex »

Meinen besten Dank für eure Antworten und die Mühe mit dem Beispielprogramm!

Ich habe mich jedoch gerade für eine andere Lösung entschieden, da ich die Sheet-Inhalte sowieso je auf einzelnen Frames habe.
Ich nutze von meinem vorhandenen PageControl nur noch die Tabs, aber nicht mehr die Sheets,
d.h. ich reduziere die Höhe auf die Tab-Höhe. Anstelle der Sheets setze ich bedarfsweise das richtige Frame unter die Tabs-Leiste.
Das Frame einfach direkt auf das Form.

Dann muss ich mich zwar um das Ein-/Ausblenden und Positionieren der Frames gesondert kümmern, aber das ist schlichter
als Tricksereien mit zusätzlichen Panels oder OwnerDraw.
Danke und Grüße, Jörg

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: TabSheet Color

Beitrag von wp_xyz »

Aidex hat geschrieben:
Fr 14. Mai 2021, 23:35
Dann muss ich mich zwar um das Ein-/Ausblenden und Positionieren der Frames gesondert kümmern, ...
Wenn du alle Frames gleichzeitig verfügbar haben willst, kannst du als Container auch ein TNotebook nehmen - das ist sowas wie ein PageControl ohne Tabs.

Antworten