Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Wm_windowposchanging (https://www.delphipraxis.net/174038-wm_windowposchanging.html)

ConnorMcLeod 29. Mär 2013 15:01

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!

jfheins 29. Mär 2013 15:07

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:
SWP_NOMOVE = 0x0002
gesetzt ist.
Falls nur die z-order verändert wird, kann da ja durchaus 0 drinstehen.

ConnorMcLeod 29. Mär 2013 15:30

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.

ConnorMcLeod 29. Mär 2013 15:58

AW: Wm_windowposchanging
 
ok, das Phänomen ist vorerst im Griff. Die Lösung sieht so aus:
Delphi-Quellcode:
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;
Jetzt wüßte ich noch gerne, wie die störende Message während des Resize ausgelöst wird. Aber naja, muss nicht.
@jfheins: Danke nochmal für den Hinweis.
@all: Schöne F'eiertage!


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:35 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