Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Fensterrand erkennen bei Windows 10 (https://www.delphipraxis.net/182193-fensterrand-erkennen-bei-windows-10-a.html)

stahli 10. Okt 2014 00:35

AW: Fensterrand erkennen bei Windows 10
 
Liste der Anhänge anzeigen (Anzahl: 1)
Der abgedockte eMail-Editor unter Win8.1 bietet übrigens schon mal einen Vorgeschmack auf den neuen Fenster-Stil.
Ich bin mir nicht sicher, wie störend ich die Änderung an der Stelle finde...

samso 14. Sep 2015 11:54

AW: Fensterrand erkennen bei Windows 10
 
Da der Fensterrand ja nun auch in der finalen Version nicht sichtbar ist, habe ich mich erneut mit dem Thema beschäftigt. Ob ein "Design mit hohem Kontrast" oder ein "Standard Design" eingestellt wurde, kann mit der Funktion UxTheme.IsCompositionActive (True = "Standard Design") ermittelt werden.

Da der Benutzer nach meinem Wissen bei Windows 10 die Fensterränder nicht mehr einstellen kann, sehe ich die Fenstermetrik als fest durch das Betriebssystem vorgegeben an.

Bei einem "Design mit hohem Kontrast" sind die optischen Abmessungen mit dem Fensterrechteck (BoundsRect) identisch. Hier brauchen also keine besonderen Vorkehrungen getroffen werden, um Fenster-Snap-Funktionalitäten (ScreenSnap, magnetische Fenster) umzusetzen.

Bei einem "Standard Design" hängen die optischen Abmessungen eher von dem ClientRect des Fensters ab. Der obere optische Rand ist noch identisch mit dem Fensterrechteck. Der linke/rechte/untere optische Rand kann durch aufschlagen einer 1-Pixel-breiten Linie um das Clientrechteck berechnet werden. Der so berechnete optische Rand hat dann je nach Borderstyle unterschiedliche Abstände zu dem BoundsRect. Dieser Abstand ist der gesuchte unsichtbare Rand der bei der Positionierung des Fensters berücksichtigt werden muss, wenn man eine Fenster-Snap-Funktionalität umzusetzen möchte.

Ich habe leider keine Funktion gefunden, mit der ich den Aufschlag (den Rand um den ClientRect) abfragen könnte. Falls Microsoft also bei irgendeiner zukünftigen Version den Rand z.B. 2 Pixel breit machen würde statt nur einen Pixel, dann läuft der ganze Algorithmus gegen die Wand.:cry:

bernd2015 18. Sep 2015 12:18

AW: Fensterrand erkennen bei Windows 10
 
Da ich einige meiner Programme per Mausklick auf "optimale" ;-) Fensterbreiten bringen möchte, habe ich mir was zusammengebastelt, was mit Win8.1 und 10 tadellos klappt.

Delphi-Quellcode:
function GetWinVersionAsInteger: Integer;
var
  Version: TOSVersionInfo;
begin
  Version.dwOSVersionInfoSize := SizeOf(OSVersionInfo);
  GetVersionEx(Version);
  Result := Version.dwMajorVersion * 10 + Version.dwMinorVersion;
end;

function GetXBorderWidth: Integer;
begin
  Result := 0;
  if GetWinVersionAsInteger >= 100 then
    Result := -GetSystemMetrics(SM_CXSIZEFRAME);
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
  LabelWinVer.Caption := IntToStr(GetWinVersionAsInteger); //zur Kontrolle ob Manifest eingebunden wurde
end;

procedure TForm1.ButtonToLeftEdgeClick(Sender: TObject);
begin
Left := 0 + GetXBorderWidth; // Fenster an den linken "Aktivisten"-Rand
end;

procedure TForm1.ButtonToRiteEdgeClick(Sender: TObject);
begin
Left := GetSystemMetrics(SM_CXSCREEN) - Width - GetXBorderWidth; // Fenster an den rechten "bürgerlich besorgten" Rand
end;
Stets aktuell


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:41 Uhr.
Seite 2 von 2     12   

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