![]() |
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? |
AW: Fensterrand erkennen bei Windows 10
Was willst du erreichen?
Was ist das Ziel davon wenn du das heraus bekommst? |
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.
|
AW: Fensterrand erkennen bei Windows 10
Zitat:
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 |
AW: Fensterrand erkennen bei Windows 10
Zitat:
die Frage ist ganze einfach zu beantworten: ![]() Und dort die Konstante SM_CXBORDER bzw. SM_CYBORDER |
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) |
AW: Fensterrand erkennen bei Windows 10
Zitat:
Echt blöd und dumm von mir, daß nun die Schwiegermutter wegen
Delphi-Quellcode:
weg ist :oops:
SM_CXBORDER and SM_CYBORDER
Wäre mir dieses
Delphi-Quellcode:
nur doch noch rechtzeitig für meine Schwiegermutter eingefallen...
SM_CXBORDER and SM_CYBORDER
Sei's drum, jetzt isse wech! Daher außerordentlich freundliche Grüße von pelzig |
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.
|
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.
|
AW: Fensterrand erkennen bei Windows 10
Zitat:
Ansonsten wäre Testen ja sinnlos. |
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... |
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: |
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; ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:03 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz