Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Zusätzlicher Button in Titelleiste?


galagher - Mo 25.01.21 10:47
Titel: Zusätzlicher Button in Titelleiste?
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


jaenicke - Mo 25.01.21 15: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:

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 - Di 26.01.21 07: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!


jaenicke - Di 26.01.21 09: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 - Di 26.01.21 10: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?


jaenicke - Di 26.01.21 12: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.