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 user profile iconjaenicke

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