Delphi-PRAXiS

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)

samso 8. Okt 2014 14:27

Delphi-Version: 2007

Fensterrand erkennen bei Windows 10
 
Hallo Zusammen,

bei Windows 10 haben die Fenster wahlweise einen unsichtbaren Rand (Windows Default Themes) oder einen sichtbaren Rand (Windows Contrast Themes). Hat jemand eine Idee, wie man die Sichtbarkeit des Rahmens abfragen kann?

Bernhard Geyer 8. Okt 2014 14:29

AW: Fensterrand erkennen bei Windows 10
 
Was willst du erreichen?
Was ist das Ziel davon wenn du das heraus bekommst?

samso 8. Okt 2014 14:36

AW: Fensterrand erkennen bei Windows 10
 
Das TForm.ScreenSnap funktioniert (aus Benutzersicht) nicht korrekt, wenn der Fensterrand unsichtbar ist. Das möchte ich reparieren. D.h. wenn der Fensterrand unsichtbar ist, soll beim Snap nur der sichtbare Teil berücksichtigt werden. Wenn allerdings die Contrast Themes ausgewählt sind, muss Snap so funktionieren wie früher.

pelzig 8. Okt 2014 15:19

AW: Fensterrand erkennen bei Windows 10
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1275260)
Was willst du erreichen?
Was ist das Ziel davon wenn du das heraus bekommst?

Eine Unterscheidung von Windows 1.x bis hoch zu Windows 1X.x? 8-)

Irgendwo irgendwann habe ich in der DP einmal gelesen, daß clientHeight und clientWidth irgendwie die Fensterrahmenmaße (des Forms) ignorieren und dadurch für eine sichere - innere Breite und Höhe der Form - sorgen.

Klappt sehr zuverlässig!

Andererseits frage ich mich, wie man die Fensterrahmenmaße (Rahmenbreite bzw. Rahmenstärke, pur oder mit Glass usw.) herausbekommt?

Also ich bin mir ABSOLUT sicher, daß man die Fensterrahmenbreite oder -stärke nicht im/vom System abfragen kann!

Und dafür bürge ich mit dem Namen (m)einer beliebigen Schwiegermutter :thumb:

MfG

Bernhard Geyer 8. Okt 2014 15:22

AW: Fensterrand erkennen bei Windows 10
 
Zitat:

Zitat von pelzig (Beitrag 1275268)
Und dafür bürge ich mit dem Namen (m)einer beliebigen Schwiegermutter :thumb:

Eigentlich dürfte jetzt keiner Antworten, aber


die Frage ist ganze einfach zu beantworten:

http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx

Und dort die Konstante SM_CXBORDER bzw. SM_CYBORDER

himitsu 8. Okt 2014 15:32

AW: Fensterrand erkennen bei Windows 10
 
Das Problem ist ja, daß der Rahmen zwar da, aber halt "unsichtbar" ist.
Ich vermute mal ganz stark, daß SM_CXBORDER den "realen" Rahmen beinhaltet.

Ich hoffe ja noch, daß in der Final keine unsichtbaren Komponenten mehr existieren und die den wenigstens hauchzart (hohe Transparenz) darstellen.
Wenn ich neben ein Fenster klicke, dann will ich auf das klicken, was ich unter meiner Maus sehe und nicht irgendeinen eventuell vorhandenen unsichtbaren Rahmen treffen, von dem man nichtmal weiß bis wohin er geht und ob er überhaupt da ist. (rahmenlose Fenster)

Jetzt schon was reparieren zu wollen, für einer Version, die noch nichtmal fertig ist. (frühestens in den RCs würde ich damit anfangen, wobei selbst da sich noch viel ändern kann)

pelzig 8. Okt 2014 16:02

AW: Fensterrand erkennen bei Windows 10
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1275269)
Zitat:

Zitat von pelzig (Beitrag 1275268)
Und dafür bürge ich mit dem Namen (m)einer beliebigen Schwiegermutter :thumb:

Eigentlich dürfte jetzt keiner Antworten, aber


die Frage ist ganze einfach zu beantworten:

http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx

Und dort die Konstante SM_CXBORDER bzw. SM_CYBORDER

Latürnich darf NIEMAND (auch nur angedacht!!!) seine Schwiegermutter jemals auch nur hypothetisch verpfänden :oops:

Echt blöd und dumm von mir, daß nun die Schwiegermutter wegen
Delphi-Quellcode:
SM_CXBORDER and SM_CYBORDER
weg ist :oops:

Wäre mir dieses
Delphi-Quellcode:
SM_CXBORDER and SM_CYBORDER
nur doch noch rechtzeitig für meine Schwiegermutter eingefallen...

Sei's drum, jetzt isse wech! Daher außerordentlich freundliche Grüße von
pelzig

Aviator 8. Okt 2014 20:41

AW: Fensterrand erkennen bei Windows 10
 
Wenn man mal genau hinschaut sieht man, dass beim Schließen der Fenster der Rahmen kurzzeitig sichtbar wird. Ich gehe mal davon aus, dass das in der Final Version "gefixt" wird.

samso 9. Okt 2014 09:53

AW: Fensterrand erkennen bei Windows 10
 
Danke für die Rückmeldungen, auch wenn es meine Frage jetzt nicht wirklich beantwortet hat. Ich befürchte, dass es Microsoft mit dem unsichtbaren Rand ernst meint, sonst würde das Verhalten beim Maximieren usw. ja anders sein. Ich folge dem Rat und warte erst mal ab.

himitsu 9. Okt 2014 10:04

AW: Fensterrand erkennen bei Windows 10
 
Zitat:

Zitat von samso (Beitrag 1275358)
Ich befürchte, dass es Microsoft mit dem unsichtbaren Rand ernst meint,

Mit etwas Glück hören sie mal auf die Tester. :stupid:

Ansonsten wäre Testen ja sinnlos.

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 01:20 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