Autor |
Beitrag |
Critter
      
Beiträge: 328
Erhaltene Danke: 3
Windows 7
Delphi 7 Pro.
|
Verfasst: Mi 27.10.10 16:03
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
_________________ Diejenigen, die grundlegende Freiheiten aufgeben, um ein wenig mehr vorrübergehende Sicherheit zu erkaufen, verdienen weder Freiheit noch Sicherheit.
(Benjamin Franklin;"The Papers of Benjamin Franklin", Vol. 6, Apr. 1, 1755, through Sep. 30, 1756)
|
|
jaenicke
      
Beiträge: 19321
Erhaltene Danke: 1749
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
      
Beiträge: 328
Erhaltene Danke: 3
Windows 7
Delphi 7 Pro.
|
Verfasst: 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
_________________ Diejenigen, die grundlegende Freiheiten aufgeben, um ein wenig mehr vorrübergehende Sicherheit zu erkaufen, verdienen weder Freiheit noch Sicherheit.
(Benjamin Franklin;"The Papers of Benjamin Franklin", Vol. 6, Apr. 1, 1755, through Sep. 30, 1756)
|
|
Critter 
      
Beiträge: 328
Erhaltene Danke: 3
Windows 7
Delphi 7 Pro.
|
Verfasst: 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
_________________ Diejenigen, die grundlegende Freiheiten aufgeben, um ein wenig mehr vorrübergehende Sicherheit zu erkaufen, verdienen weder Freiheit noch Sicherheit.
(Benjamin Franklin;"The Papers of Benjamin Franklin", Vol. 6, Apr. 1, 1755, through Sep. 30, 1756)
|
|
LSanchez
      
Beiträge: 26
Erhaltene Danke: 8
|
Verfasst: 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
|
|
|