Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Snap Assist - Wie wird das "Vorschaufenster-Rect" bestimmt? (https://www.delphipraxis.net/209205-snap-assist-wie-wird-das-vorschaufenster-rect-bestimmt.html)

Michael II 9. Nov 2021 14:16

Snap Assist - Wie wird das "Vorschaufenster-Rect" bestimmt?
 
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?

venice2 9. Nov 2021 15:17

AW: Snap Assist - Wie wird das "Vorschaufenster-Rect" bestimmt?
 
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)

Michael II 10. Nov 2021 15:28

AW: Snap Assist - Wie wird das "Vorschaufenster-Rect" bestimmt?
 
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 ;-).

Uwe Raabe 10. Nov 2021 15:33

AW: Snap Assist - Wie wird das "Vorschaufenster-Rect" bestimmt?
 
Hast du schon mal den WParam überprüft, ob der in beiden Fällen gleich ist?

Michael II 10. Nov 2021 15:50

AW: Snap Assist - Wie wird das "Vorschaufenster-Rect" bestimmt?
 
Werde ich tun - besten Dank.

venice2 10. Nov 2021 15:50

AW: Snap Assist - Wie wird das "Vorschaufenster-Rect" bestimmt?
 
Ich würde es mal mit
WM_WINDOWPOSCHANGING
WM_ENTERSIZEMOVE

versuchen! Ohne gewähr.

also

Delphi-Quellcode:
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 ;)

Michael II 10. Nov 2021 16:29

AW: Snap Assist - Wie wird das "Vorschaufenster-Rect" bestimmt?
 
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 II 10. Nov 2021 16:31

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

Zitat von Uwe Raabe (Beitrag 1497374)
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... (?).

Uwe Raabe 10. Nov 2021 16:38

AW: Snap Assist - Wie wird das "Vorschaufenster-Rect" bestimmt?
 
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.

venice2 10. Nov 2021 16:40

AW: Snap Assist - Wie wird das "Vorschaufenster-Rect" bestimmt?
 
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.


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

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