![]() |
Wm_windowposchanging
Hallo Kollegen,
wie die meisten von Euch wissen, kann man auf die Änderung der Fensterdimensionen (Move und Resize) so reagieren:
Delphi-Quellcode:
.
procedure WMWindowPosChanging(var AMessage: TWMWindowPosChanging); message WM_WINDOWPOSCHANGING;
Die Message überbringt einen Pointer auf eine Struktur, in der die neuen Dimensionen stehen.
Delphi-Quellcode:
.
AMessage.WindowPos^
... zeigt auf ... tagWINDOWPOS = packed record hwnd: HWND; hwndInsertAfter: HWND; x: Integer; y: Integer; cx: Integer; cy: Integer; flags: UINT; end; Ich habe mir gezwungenermassen den Spaß gemacht und nachgesehen, welche Werte in der Struktur stehen und staunte nicht schlecht: in ca. 5% der Fälle steht beim Resize in x, y fälschlicherweise Null (in Zahlen: 0). Kennt vllt jmd die Antwort, warum das so ist? Wie immer danke für alle Ideen! |
AW: Wm_windowposchanging
was heißt denn hier fälschlicherweise ??
Das kommt doch auf die Flags drauf an, ob da überhaupt sinnvolle Werte drin stehen. In diesem Sinne: Schau mal nach ob das Flag
Code:
gesetzt ist.
SWP_NOMOVE = 0x0002
Falls nur die z-order verändert wird, kann da ja durchaus 0 drinstehen. |
AW: Wm_windowposchanging
Fälschlicherweise heißt fälschlicherweise.
Indem man das Testfenster mit der Maus am Rand nimmt und so die Größe ändert, ergibt sich ein Resize, wenn ich mich nicht irre. Beim Mitloggen der Messages sehe ich ab und zu die Nullen. Im Testfenster passiert nichts anderes als das Reagieren auf den ThemenTitel und auf WM_ENTERSIZEMOVE, WM_EXITSIZEMOVE, WM_SIZING, WM_MOVING. Deswegen glaube ich, daß ich mir nicht selbst in die Quere komme. Trotzdem danke, ich checke es nochmal. Könnte ja sein, daß Win7 im Hintergrund mal eine Z-Order refresht oder so. |
AW: Wm_windowposchanging
ok, das Phänomen ist vorerst im Griff. Die Lösung sieht so aus:
Delphi-Quellcode:
Jetzt wüßte ich noch gerne, wie die störende Message während des Resize ausgelöst wird. Aber naja, muss nicht.
var
lwpWindowPos: TWindowPos; // originale Dimensionen li : integer; // SZ begin lwpWindowPos := AMessage.WindowPos^; li := (SWP_NOMOVE and lwpWindowPos.flags); if (0 <> li) then begin inherited; exit; end; @jfheins: Danke nochmal für den Hinweis. @all: Schöne F'eiertage! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:48 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