Autor Beitrag
Critter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 328
Erhaltene Danke: 3

Windows 7
Delphi 7 Pro.
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19321
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 328
Erhaltene Danke: 3

Windows 7
Delphi 7 Pro.
BeitragVerfasst: 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

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 328
Erhaltene Danke: 3

Windows 7
Delphi 7 Pro.
BeitragVerfasst: Mi 27.10.10 17:44 
Hallo,

wenn man das richtige Handle nimmt, dann klappt es auch:

ausblenden 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

_________________
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 26
Erhaltene Danke: 8



BeitragVerfasst: 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