vinduer - Sådan opdages når formularen bliver maksimeret?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg vil gerne opdage, hvornår formularen skal maksimeres for at gemme visse indstillinger (ikke relateret til størrelse eller position) og ændre størrelse og position lidt. Er der en universel måde at gøre det på?
Jeg har forsøgt at fange WM\_SYSCOMMAND beskeden som i denne artikel. Det fungerer godt for at maksimere fra menuen, ved at maksimere knappen, men den bliver ikke fyret, når jeg trykker på WIN + UP tastetrykket. Kender nogen en universel måde, hvordan man kan fange maksimeringshændelsen, herunder tilfældet med WIN + UP tastetryk? [23]


Tak

Bedste reference


Du kan bruge meddelelsen WM\_GETMINMAXINFO til at gemme vinduets tilstand og derefter bruge meddelelsen WMSize for at kontrollere om vinduet blev maksimeret. [24] [25]


i din form erklære den beskedne håndterer som sådan:


procedure WMSize(var Msg: TMessage); message WM\_SIZE;


Og håndtere sådan:


procedure TForm57.WMSize(var Msg: TMessage);
begin
  if Msg.WParam  = SIZE\_MAXIMIZED then
    ShowMessage('Maximized');    
end;

Andre referencer 1


WIN + UP genererer ikke WM\_SYSCOMMAND beskeder, derfor kan du ikke fange dem. Det genererer dog WM\_GETMINMAXINFO, WM\_WINDOWPOSCHANGING, WM\_NCCALCSIZE, WM\_MOVE, WM\_SIZE og WM\_WINDOWPOSCHANGED meddelelser. Som RRUZ sagde, brug WM\_GETMINMAXINFO til at detektere, hvornår en maksimal operation er ved at begynde, og WM\_SIZE til at detektere, når den er færdig.

Andre referencer 2


IMO, Du kan ikke bruge WM\_GETMINMAXINFO til at 'registrere, hvornår en maksimere operation er ved at begynde ' som @Remy angivet.


Faktisk er den eneste besked, der kan være WM\_SYSCOMMAND med Msg.CmdType=SC\_MAXIMIZE eller undocumented SC\_MAXIMIZE2 = $F032 - men den sendes ikke via Win+UP eller ved at bruge ShowWindow(Handle, SW\_MAXIMIZE) for eksempel.


Den eneste måde jeg kunne opdage, at et vindue er ved at blive maksimeret, er via WM\_WINDOWPOSCHANGING, som fyres lige efter WM\_GETMINMAXINFO:


type
  TForm1 = class(TForm)
  private
    procedure WMWindowPosChanging(var Message: TWMWindowPosChanging); message WM\_WINDOWPOSCHANGING;
  end;

implementation

const
  SWP\_STATECHANGED = $8000;

procedure TForm1.WMWindowPosChanging(var Message: TWMWindowPosChanging);
begin
  inherited;
  if (Message.WindowPos^.flags and (SWP\_STATECHANGED or SWP\_FRAMECHANGED)) <> 0 then
  begin
    if (Message.WindowPos^.x < 0) and (Message.WindowPos^.y < 0) then
      ShowMessage('Window state is about to change to MAXIMIZED');
  end;
end;