Wenn ich ein Delphi-Formular maximiere, sind die Werte für Breite und Höhe um 8 Pixel größer als die entsprechenden GetSystemMetrics SM_CXSCREEN und SM_CYSCREEN?
Beispiel:
Wenn ich mit der rechten Maustaste auf meinen Bildschirm klicke und Eigenschaften erhalte, habe ich eine 1680 X 1050 Bildschirmauflösung. Dies sind die gleichen Werte, die von GetSystemMetrics (SM_CXSCREEN) und GetSystemMetrics (SM_CYSCREEN) zurückgegeben werden.
Wenn ich das Formular in meiner Delphi-Anwendung maximiere, bekomme ich eine Breite von 1688 und eine Höhe von 1058. Es gibt einen Unterschied von 8 Pixeln. Was verursacht diesen Unterschied?
Wenn maximierte Fenster ursprünglich implementiert wurden, wollten die Designer die Größenänderungsgrenzen entfernen. Anstatt sie zu entfernen, entschieden sie stattdessen, diese Grenzen über die Ränder des Bildschirms hinaus zu ziehen, wo sie nicht gesehen werden würden. Daher das ziemlich überraschende Fensterrechteck eines maximierten Fensters.
Diese Implementierung Entscheidung wurde ein Problem mit dem Aufkommen von Multi-Monitor-Systemen. Zu dieser Zeit gab es Anwendungen, die sich auf dieses Verhalten stützten, und so beschloss das Windows-Team, das Verhalten aus Kompatibilitätsgründen beizubehalten. Dies führte dazu, dass maximierte Fenster auf benachbarte Bildschirme austraten. Mit der Zeit erwarb der Window Manager Fähigkeiten, die dazu dienten, dieses Leck zu unterdrücken.
Raymond Chen hat wie üblich einen Artikel, der die Details behandelt: Warum hat ein maximiertes Fenster das falsche Fensterrechteck?
Ich habe ein einfaches Programm geschrieben, das WM_GETMINMAXINFO
Die Auflösung meines Bildschirms ist 1440x900.
Es scheint, dass Windows das Fenster nach der Maximierung so positioniert, dass der Client-Bereich den maximal verfügbaren Platz einnimmt und das Fenster-Fenster außerhalb des Bildschirmbereichs verborgen ist.