Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Tabs in Default Style Zeichnen
Critter - Mi 27.10.10 16:03
Titel: Tabs in Default Style Zeichnen
Hallo,
ich würde gerne einer PageControl schließen Knöpfe spendieren. Meine Idee war, einfach ein paar Knopf Symbole mit auf die Tabs zu mahlen, und dann einen Klick in den entsprechenden Bereich zu behandeln.
Das Problem ist, sobald ich OwnerDraw aktiviere wird mir auch der Hintergrund nicht mehr gezeichnet. Ich möchte aber, dass meine Tabs das gleiche Design haben, wie es im jeweils aktiven Windows-Theme vorgesehen ist, also z. B. unter XP mit aktiven Luna soll ein Farbverlauf dargestellt werden und die aktive Page soll diesen orangen Balken an der Oberkante haben. Unter Vista/7 soll es auch nach Aero aussehen und bei allem was danach kommt eben nach dem was danach kommt.
Habt ihr eine Idee, wie man das hingekommen könnte? Ich nehme an es gibt keine Widows Funktion "Zeichne Ein Tab mit Text X in Rect Z" oder so?
critter
jaenicke - Mi 27.10.10 16:39
Doch vielleicht gibt es das. Schau dir einmal die Unit Themes an, dort sollte es ThemeServices.DrawElement oder so geben und als Element TThemedTab oder so ähnlich. Ich habe da dunkel eine Erinnerung, dass damit etwas gehen könnte, genauer kann ich dann zu Hause schauen...
Critter - Mi 27.10.10 17:12
Hallo,
das hört sich schon einmal sehr Spannend an, auch wenn meiner ersten Experimente noch keinen Erfolg hatten
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| procedure TForm1.PageControl1DrawTab(Control: TCustomTabControl; TabIndex: Integer; const Rect: TRect; Active: Boolean); var Details : TThemedElementDetails; begin Details := ThemeServices.GetElementDetails(ttTabItemNormal); ThemeServices.DrawElement(Control.Handle, Details, Rect); ThemeServices.DrawText(Control.Handle, Details, IntToStr(TabIndex), Rect, DT_LEFT, 0); end; |
Ich werde da aber auf jeden Fall noch ein wenig experimentieren, die Existenz dieser Unit ist mir bisher wohl entgangen.
Deshalb, danke für den Hinweis
critter
Critter - Mi 27.10.10 17:44
Hallo,
wenn man das richtige Handle nimmt, dann klappt es auch:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| procedure TForm1.PageControl1DrawTab(Control: TCustomTabControl; TabIndex: Integer; const Rect: TRect; Active: Boolean); Var Details : TThemedElementDetails; PC : TPageControl; begin If Not (Control is TPageControl) Then Exit; PC := (Control as TPageControl); If (TabIndex = PC.TabIndex) Then Details := ThemeServices.GetElementDetails(ttTabItemSelected) Else Details := ThemeServices.GetElementDetails(ttTabItemNormal); ThemeServices.DrawElement(Control.Canvas.Handle, Details, Rect); ThemeServices.DrawText(Control.Canvas.Handle, Details, IntToStr(TabIndex), Rect, DT_LEFT, DT_BOTTOM); end; |
Der Text sitzt zwar noch nicht da, wo ich ihn haben will und sowieso werde ich noch rausfinden müssen, wie ich an der Größe des Tabs drehe, aber das sind andere Themen, somit sehe ich dieses als beantwortet an.
Danke
jaenicke
critter
LSanchez - Fr 29.10.10 11:58
Hallo,
nur als Hinweis. Mit der Unit XPMan in dem USES-Teil deiner Unit aktivierst Du die Laufzeit-Themes in deiner Anwendung.
Gruß
Luis Sanchez
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!