AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Snap Assist - Wie wird das "Vorschaufenster-Rect" bestimmt?
Thema durchsuchen
Ansicht
Themen-Optionen

Snap Assist - Wie wird das "Vorschaufenster-Rect" bestimmt?

Ein Thema von Michael II · begonnen am 9. Nov 2021 · letzter Beitrag vom 12. Nov 2021
Antwort Antwort
Seite 1 von 2  1 2      
Michael II

Registriert seit: 1. Dez 2012
Ort: CH BE Eriswil
721 Beiträge
 
Delphi 11 Alexandria
 
#1

Snap Assist - Wie wird das "Vorschaufenster-Rect" bestimmt?

  Alt 9. Nov 2021, 14:16
Ich verwende ab und zu bsSizeable Fenster mit konstantem Seitenverhältnis ClientWidth:ClientHeight.

Wenn ich zum Beispiel den unteren Rand eines solchen Fensters an den unteren Rand des Arbeitsbereichs ziehe, dann will Windows "einschnappen" und zeigt mir mittels Rahmen an, wo das eingeschnappte Fenster zu liegen käme.

Wie übermittle ich an Windows das Rechteck des eingeschnappten Fensters?

Mein Programm reagiert auf WM_Sizing, via LParam gebe ich den Pointer aufs jeweilige Rect zurück. Der Rahmen des eingeschnappten Fensters wird in Windows 6.3.9600, 10.0.17763.2237 korrekt angezeigt.
Bei 10.0.19044.1320 hingegen zeigt Windows einen Rahmen an, welcher (im vorliegenden Fall erwartet) so hoch wie der Arbeitsbereich ist, die Breite entspricht aber nur der momentanen Breite des Fensters. WM_Sizing wird beim "Schnappen?" ausgelöst, 10.0.19044.1320 scheint aber die Rückgabe des Rechtecks nicht zu beachten.

Wenn ich das Fenster einschnappen lasse, dann wird das Fenster in allen Windows Versionen korrekt dargestellt.

Weiss irgendwer, wie ich das verbessern kann?
Michael Gasser

Geändert von Michael II ( 9. Nov 2021 um 15:15 Uhr)
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#2

AW: Snap Assist - Wie wird das "Vorschaufenster-Rect" bestimmt?

  Alt 9. Nov 2021, 15:17
Sorry irgendwie verstehe ich deine Frage nicht.
Basierend auf was?

Was für ein Fenster? MDI Child?

btw.. Wie kann man das testen?

EDIT:
Ok habe gegoogelt
Ist in den System\Multitasking Einstellungen

Ich verwende es nicht kann daher keine Antwort geben.
Habe meine eigene Snap Anwendung (als Interface in meiner Engine)

Geändert von venice2 ( 9. Nov 2021 um 17:44 Uhr)
  Mit Zitat antworten Zitat
Michael II

Registriert seit: 1. Dez 2012
Ort: CH BE Eriswil
721 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Snap Assist - Wie wird das "Vorschaufenster-Rect" bestimmt?

  Alt 10. Nov 2021, 15:28
Besten Dank venice2 für deine Reaktion.

Ich habe halt Kundinnen und Kunden, welche Snap Assist verwenden. Da kann und will ich nicht bestimmen, ob's erlaubt ist.

Und ich nehme mal an, dass viele Menschen hier auch skalierbare Fenster in Ihren Windows Apps eingebaut haben und damit eventuell vor dem gleichen "Problem" stehen; oder keine Probleme haben, weil es sie es anders gelöst haben.

OK noch einmal. Nehmen wir sehr stark vereinfachend an:

Form F, Arbeitsbereich A

- Abmessungen A: 2000x1200
- F behält beim Skalieren Breite:Höhe = 4:3 bei.
- F ist momentan 380 hoch und 10 vom unteren Rand von A weg.

Wir ziehen nun am unteren Rand von F nach unten.
Sobald der untere Rand von F am Rand von A liegt (F ist dann 390 hoch, also 520 breit), will Windows die Grösse von F anpassen.
Windows zeigt dir dies an, indem der Rahmen des angepassten Fs angezeigt wird.

Windows sollte hier ein Fenster mit Höhe 1200 und damit (weil Breite:Höhe = 4:3) Breite 1600 anzeigen.

Meine Frage:
Wie teilt man Windows die Abmessungen des anzuzeigenden Rahmens von F mit?

Bisher hatte ich das so gelöst:
Windows sendet WM_Sizing. F reagiert auf Msg = WM_Sizing und antwortet mit dem Rechteck von F (hier 1600x1200).
Das hat auch lange funktioniert.
D.h. Windows zeigte in obigem Beispiel einen Rahmen der Grösse 1600x1200 an.

Bei neueren Windows Versionen funktioniert das nicht mehr: Neu ist der von Windows angezeigte Rahmen so breit wie F momentan breit ist (also hier 520) und 1200 hoch. Windows zeigt also einen Rahmen mit Abmessungen 520x1200 an.
Wenn ich das Schnappen zulasse (also nicht mit Enter abbreche), dann wird das Fenster korrekt 1600x1200 gezeichnet.
Windows sendet zwar bei der Windows "Schnappanfrage" wie bisher ein WM_Sizing, beachtet aber das zurückgegebene Rect (1600x1200) offenbar nicht mehr.

Jede Hilfe wird geschätzt .
Michael Gasser

Geändert von Michael II (10. Nov 2021 um 15:30 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.007 Beiträge
 
Delphi 12 Athens
 
#4

AW: Snap Assist - Wie wird das "Vorschaufenster-Rect" bestimmt?

  Alt 10. Nov 2021, 15:33
Hast du schon mal den WParam überprüft, ob der in beiden Fällen gleich ist?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Michael II

Registriert seit: 1. Dez 2012
Ort: CH BE Eriswil
721 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Snap Assist - Wie wird das "Vorschaufenster-Rect" bestimmt?

  Alt 10. Nov 2021, 15:50
Werde ich tun - besten Dank.
Michael Gasser
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#6

AW: Snap Assist - Wie wird das "Vorschaufenster-Rect" bestimmt?

  Alt 10. Nov 2021, 15:50
Ich würde es mal mit
WM_WINDOWPOSCHANGING
WM_ENTERSIZEMOVE

versuchen! Ohne gewähr.

also

WM_SIZING, WM_WINDOWPOSCHANGING, WM_ENTERSIZEMOVE:

EDIT:
Eventuell mußt du WM_SIZING entfernen.
Es schadet auch nicht mal andere Messagen zu prüfen ob du hier das gewünschte Ergebnis erhältst.

Auf der anderen Seite kannst du Messagen Anzeigen lassen die während der Laufzeit verwendet werden.

Zitat:
Windows sendet zwar bei der Windows "Schnappanfrage" wie bisher ein WM_Sizing
Würde ich nochmals gegenprüfen ob es wirklich so ist es muß sich ja etwas geändert haben.
Alternativ es wird einfach nicht mehr gesendet dann hast du ein Problem.

Vielleicht helfen die Bescheidenen Infos ja etwas

Geändert von venice2 (10. Nov 2021 um 16:19 Uhr)
  Mit Zitat antworten Zitat
Michael II

Registriert seit: 1. Dez 2012
Ort: CH BE Eriswil
721 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Snap Assist - Wie wird das "Vorschaufenster-Rect" bestimmt?

  Alt 10. Nov 2021, 16:29
Hallo Uwe

WParam ist gleich: Wenn ich am unteren Rand des Fensters ziehe und Windows schnappen will, dann wird via WParam WMSZ_BOTTOM = 6; übergehen, wenn ich am oberen Rand ziehe WMSZ_TOP = 3;.
Ich erhalte bei der Schnappanfrage via LParam die korrekte Höhe (Höhe Arbeitsbereich), passe die Breite an. Ich gebe via LParam die korrekte Grösse zurück. Windows ignoriert die Breite.

[ Zudem (hat hier nix mit dem "Problem" zu tun): Wenn ich das "eingeschnappte" Fenster "entschnappe", indem ich auf die Titelzeile klicke und das Fenster nach unten ziehe wird WParam=9 übergeben. Dieser Wert ist - soweit ich sehe - weder in Delphi 10.4 noch Delphi 11 als WMSZ_??? definiert; wahrscheinlich weil man diesen Wert auch auf m$ bei den Infos zu WM_Sizing nicht findet. ]

Hallo venice2

werde ich dann mal testen.

Es wäre schön, wenn es auf einer m$ Seite irgendwo Infos dazu gäbe.

Das bisherige Vorgehen wurde in einem m$ Blog so beschrieben; ich finde die Seite grad nicht mehr.

Danke für eure Antworten.

Eventuell liegt's nur an 10.0.19044.1320 und m$ passt das wieder an.
Michael Gasser

Geändert von Michael II (10. Nov 2021 um 16:42 Uhr)
  Mit Zitat antworten Zitat
Michael II

Registriert seit: 1. Dez 2012
Ort: CH BE Eriswil
721 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Snap Assist - Wie wird das "Vorschaufenster-Rect" bestimmt?

  Alt 10. Nov 2021, 16:31
Hast du schon mal den WParam überprüft, ob der in beiden Fällen gleich ist?

Ah du meinst wahrscheinlich bei der Rückgabe des Rechtecks (?) und gar nicht, wenn die Meldung WM_Sizing ankommt... (?).
Michael Gasser
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.007 Beiträge
 
Delphi 12 Athens
 
#9

AW: Snap Assist - Wie wird das "Vorschaufenster-Rect" bestimmt?

  Alt 10. Nov 2021, 16:38
Eigentlich beides. Wobei ich nicht sicher bin ob eine Änderung des WParam überhaupt etwas bewirkt. Kann auch einfach nur ein verändertes Verhalten in Windows sein. Dann kannste eh nicht viel machen.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#10

AW: Snap Assist - Wie wird das "Vorschaufenster-Rect" bestimmt?

  Alt 10. Nov 2021, 16:40
Ok eins noch.
Was sagt denn die Funktion GetWindowRgnBox ?
Zitat:
The GetWindowRgnBox function retrieves the dimensions of the tightest bounding rectangle for the window region of a window.
EDIT:
Messagen die Ausgelöst werden während das Fenster vom Snap Assist neu Positioniert wurde! Siehe Shot.
Dazwischen mußt du fündig werden.

Geändert von venice2 (25. Nov 2021 um 19:24 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:32 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