Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Breite von Buttons in Fenster-Caption (https://www.delphipraxis.net/210661-breite-von-buttons-fenster-caption.html)

Amateurprofi 23. Mai 2022 23:54

Breite von Buttons in Fenster-Caption
 
Ich versuche seit einiger Zeit, herauszufinden, wie breit die Buttons in einer Window-Caption sind (Minimize-, Maximize-, CloseButton).
Mit
Delphi-Quellcode:
GetSystemMetrics(SM_CXSMSIZE);
erhalte ich 15, tatsächlich sind die Buttons 21 Pixel breit.
Ich vermute, dass sich die Erklärung in der OH
"The width of small caption buttons, in pixels."
auf Fenster mit Borderstyle bsSizeToolWin oder bsToolWindow bezieht.
Aber auch da ist der CloseButton 13, nicht 15 Pixel breit.

Ein weiterer Versuch mit
Delphi-Quellcode:
var Info:TTitleBarInfoEx;
begin
   Info.cbSize:=SizeOf(Info);
   SendMessage(Handle,WM_GETTITLEBARINFOEX,0,Integer(@Info));
end;
ergibt für die Buttons eine Breite von 25 Pixel.
Zudem sind die in TTitleBarInfoEx nicht stimmig, weil sich die dort angegebenen Koordinaten überschneiden.

Weiß jemand, wie man die Koordinaten der Buttons zuverlässig ermitteln kann?


Delphi-Quellcode:
PROCEDURE TMain.Test;
const
   MinimizeBtn=2;
   MaximizeBtn=3;
   HelpBtn=4;
   CloseBtn=5;
   Names:Array[2..5] of String=('MinimizeBtn','Maximizebtn','HelpBtn','CloseBtn');
var
   Info:TTitleBarInfoEx;
   BS:Integer;
FUNCTION RectStr(Index:Integer):String;
var R:TRect;
begin
   R:=Info.rgrect[Index];
   Result:='L:'+IntToStr(R.Left)+' T:'+IntToStr(R.Top)+
           ' R:'+IntToStr(R.Right)+' B:'+IntToStr(R.Bottom)+
           ' W:'+IntToStr(R.Width)+' H:'+IntToStr(R.Height)+
           ' '+Names[Index];
end;
begin
   Info.cbSize:=SizeOf(Info);
   SendMessage(Handle,WM_GETTITLEBARINFOEX,0,Integer(@Info));
   BS:=GetSystemMetrics(SM_CXSMSIZE);
   ShowMessage(RectStr(MinimizeBtn)+#13+
               RectStr(MaximizeBtn)+#13+
               RectStr(CloseBtn)+#13+
               'BS:'+IntToStr(BS)+' SM_CXSMSIZE');
//   ---------------------------
//   Calculator
//   ---------------------------                      (Tatsächlich      )
//   L:1098 T:101 R:1123 B:127 W:25 H:26 MinimizeBtn (L=1101 R=1122 W=21)
//   L:1121 T:101 R:1146 B:127 W:25 H:26 Maximizebtn (L=1122 R=1143 W=21)
//   L:1144 T:101 R:1169 B:127 W:25 H:26 CloseBtn    (L=1145 R=1166 W=21)
//   BS:15 SM_CXSMSIZE
//   ---------------------------
//   OK
//   ---------------------------
end;

Der schöne Günther 24. Mai 2022 06:08

AW: Breite von Buttons in Fenster-Caption
 
Also ich bekomme, beispielhaft, eine Größe von 60 × 37 Pixel heraus. Bildschirmfoto gemacht, nachgemessen, stimmt.

Dann habe ich in den Projektoptionen spaßeshalber mal die "DPI Awareness" auf "Unaware" geschaltet. Das Programm sieht wieder schön verschwommen und matschig aus, und liefert jetzt auch viel kleinere Pixelgrößen. Daher meine Vermutung dass in deinem Projekt die DPI Awareness ausgeschaltet ist?

PS: Windows 10 oder Windows 11? Unter letzterem habe ich schon öfter gesehen dass sich die System-Buttons überlappen oder unterschiedlich groß sind. Irre.

Uwe Raabe 24. Mai 2022 08:32

AW: Breite von Buttons in Fenster-Caption
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1506281)
Daher meine Vermutung dass in deinem Projekt die DPI Awareness ausgeschaltet ist?

Dafür gibt es ja auch GetSystemMetricsForDpi.

Amateurprofi 24. Mai 2022 08:52

AW: Breite von Buttons in Fenster-Caption
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1506281)
Also ich bekomme, beispielhaft, eine Größe von 60 × 37 Pixel heraus. Bildschirmfoto gemacht, nachgemessen, stimmt.

Dann habe ich in den Projektoptionen spaßeshalber mal die "DPI Awareness" auf "Unaware" geschaltet. Das Programm sieht wieder schön verschwommen und matschig aus, und liefert jetzt auch viel kleinere Pixelgrößen. Daher meine Vermutung dass in deinem Projekt die DPI Awareness ausgeschaltet ist?

PS: Windows 10 oder Windows 11? Unter letzterem habe ich schon öfter gesehen dass sich die System-Buttons überlappen oder unterschiedlich groß sind. Irre.

Danke.
Kann aber "DPI Awareness" in den Projektoptionen nicht finden.
Mag an meinem System liegen (Windows 7, Delphi XE2).

Der schöne Günther 24. Mai 2022 08:54

AW: Breite von Buttons in Fenster-Caption
 
Ich glaube vor über zehn Jahren war so etwas noch gar nicht erfunden 🤔

Amateurprofi 24. Mai 2022 08:56

AW: Breite von Buttons in Fenster-Caption
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1506287)
Zitat:

Zitat von Der schöne Günther (Beitrag 1506281)
Daher meine Vermutung dass in deinem Projekt die DPI Awareness ausgeschaltet ist?

Dafür gibt es ja auch GetSystemMetricsForDpi.

Danke, scheint es bei mir nicht zu geben (Delphi XE2).

Poelser 24. Mai 2022 09:15

AW: Breite von Buttons in Fenster-Caption
 
Eben mal nachgesehen: GetSystemMetricsForDPI gibt's nicht in D10.2, wohl aber in D10.4 :thumb:.

venice2 24. Mai 2022 09:47

AW: Breite von Buttons in Fenster-Caption
 
Zitat:

Zitat von Amateurprofi (Beitrag 1506292)
Zitat:

Zitat von Uwe Raabe (Beitrag 1506287)
Zitat:

Zitat von Der schöne Günther (Beitrag 1506281)
Daher meine Vermutung dass in deinem Projekt die DPI Awareness ausgeschaltet ist?

Dafür gibt es ja auch GetSystemMetricsForDpi.

Danke, scheint es bei mir nicht zu geben (Delphi XE2).

Braucht man dafür Delphi? Sicherlich nicht!
Aber Windows 10.

Amateurprofi 24. Mai 2022 17:14

AW: Breite von Buttons in Fenster-Caption
 
Zitat:

Zitat von venice2 (Beitrag 1506297)
Braucht man dafür Delphi? Sicherlich nicht!
Aber Windows 10.

Ich hab Windows 7.

venice2 24. Mai 2022 17:56

AW: Breite von Buttons in Fenster-Caption
 
Zitat:

Zitat von Amateurprofi (Beitrag 1506339)
Zitat:

Zitat von venice2 (Beitrag 1506297)
Braucht man dafür Delphi? Sicherlich nicht!
Aber Windows 10.

Ich hab Windows 7.

Dann hat es sich ja erübrigt.
Unter Windows 7 in der User32.dll gibt es diese Funktion GetSystemMetricsForDpi nicht.

Unter Windows 10 hättest du dir die Funktion ansonsten selber für ältere Delphi Version schreiben können.
Das meinte ich mit braucht man dafür Delphi.

Zitat:

Minimum supported client Windows 10, version 1607 [desktop apps only]


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:29 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz