Autor Beitrag
galagher
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2448
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Mo 25.01.21 09:47 
Hallo!

Ich möchte gern einen Button in der Titelleiste der Form haben, den man auch anklicken können muss.
Zwar gibt es bei den Jedi's eine Komponente - TCaptionBarButton (oder so ähnlich), die hat aber zwei unschöne Bugs: 1. macht sie den Fenstertitel (Caption) zunächst unsichtbar, 2. zeichnet sie die Titelleiste völlig neu ohne Rücksicht auf ein Windows-Theme.

Wie erhalte ich Zugriff auf die Titelleiste eines Fensters und wie setze ich da einen Button drauf?

lg
galagher

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 18980
Erhaltene Danke: 1680

W10 x64 (Chrome, Edge)
Delphi 10.4 Ent, Oxygene, C# (VS 2019), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 25.01.21 14:26 
Ab Delphi 10.4 kannst du eine Komponente TTitleBarPanel auf das Formular legen und der Eigenschaft CustomTitleBar des Formulars als Control zuweisen. Dann musst du CustomTitlebar.Enabled noch auf True setzen und kannst dann in dieser Komponente Buttons hinzufügen usw., was viel besser funktioniert als die ganzen externen Komponenten, die ich kenne.

Im OnPaint kannst du dann dort ein Bild hinein kopieren oder etwas anderes zeichnen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TForm121.TitleBarPanel1CustomButtons0Paint(Sender: TObject);
var
  CurrentButton: TSystemTitlebarButton;
begin
  CurrentButton := Sender as TSystemTitlebarButton;
  CurrentButton.Canvas.MoveTo(00);
  CurrentButton.Canvas.LineTo(3030);
end;
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2448
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Di 26.01.21 06:35 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Ab Delphi 10.4 kannst du eine Komponente TTitleBarPanel auf das Formular legen
Ich habe nicht vor, jährlich eine neue Delphiversion zu installieren. Ich benutze Delphi 10.1, das reicht für meine Hobbyzwecke völlig.
Im Internet gibt es ja etwas zu dem Thema. Ist einiges an Code, der Button liegt dann aber leider unter der Titelleiste des Fensters. Will man ihn darauf haben, muss man dann wohl die Titelleiste neu zeichnen, dabei kann man aber ein eventuelles Windows-Theme nicht berücksichtigen, daher sieht das Ganze schon mal anders aus - das gleiche also, wie bei der besagten Jedi-Komponente.

Ich werde also einen einfachen, normalen Button verwenden!

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 18980
Erhaltene Danke: 1680

W10 x64 (Chrome, Edge)
Delphi 10.4 Ent, Oxygene, C# (VS 2019), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 26.01.21 08:57 
user profile icongalagher hat folgendes geschrieben Zum zitierten Posting springen:
Im Internet gibt es ja etwas zu dem Thema. Ist einiges an Code, der Button liegt dann aber leider unter der Titelleiste des Fensters. Will man ihn darauf haben, muss man dann wohl die Titelleiste neu zeichnen, dabei kann man aber ein eventuelles Windows-Theme nicht berücksichtigen, daher sieht das Ganze schon mal anders aus - das gleiche also, wie bei der besagten Jedi-Komponente.
Wenn ich den Quelltext richtig verstehe (habe ihn nur ganz kurz überflogen), wird in der Delphi-eigenen Komponente der Rest der Titelleiste nicht selbst gezeichnet. Für zusätzliche Systembuttons z.B. wird das Theming je nach Windowsversion angewendet.

user profile icongalagher hat folgendes geschrieben Zum zitierten Posting springen:
Ich habe nicht vor, jährlich eine neue Delphiversion zu installieren. Ich benutze Delphi 10.1, das reicht für meine Hobbyzwecke völlig.
Die Community Edition gibt es noch gar nicht in Version 10.4, von daher kommt das aktuell ohnehin nicht in Frage.
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2448
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Di 26.01.21 09:37 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Wenn ich den Quelltext richtig verstehe (habe ihn nur ganz kurz überflogen), wird in der Delphi-eigenen Komponente der Rest der Titelleiste nicht selbst gezeichnet. Für zusätzliche Systembuttons z.B. wird das Theming je nach Windowsversion angewendet.
Es muss ja kein Button sein, ein Bitmap oder TImage reichen mir schon, solange ich auch darauf zugreifen kann (OnClick usw.). Nur: Wie komme ich an die Titelleiste ran? Wie zeichne ich dort etwas?

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 18980
Erhaltene Danke: 1680

W10 x64 (Chrome, Edge)
Delphi 10.4 Ent, Oxygene, C# (VS 2019), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 26.01.21 11:26 
user profile icongalagher hat folgendes geschrieben Zum zitierten Posting springen:
Nur: Wie komme ich an die Titelleiste ran? Wie zeichne ich dort etwas?
Im Quelltext habe ich nun gesehen, dass dort doch Funktionen verwendet werden um das Icon und den Text usw. zu zeichnen. Dort wird der normale Canvas des Formulars verwendet. Damit alles richtig aussieht, wird der TStyleManager.SystemStyle verwendet.

Es sieht aber auch wirklich genau wie im Original aus...

Was da ansonsten noch genau passiert, weiß ich aber nicht. Dafür habe ich gerade leider keine Zeit.