Уведомление ОС посылает к окну, когда его состояние изменилось это WM_SIZE
сообщение. Это не очевидно из кодовой цитаты, которую вы опубликовали, но VCL уже прослушивает WM_SIZE
в классе TScrollingWinControl
(восходящий TCustomForm
) и вызывает виртуальную процедуру Resizing
во время обработки сообщения.
Таким образом, вы можете переопределить этот метод своей формы, чтобы получить уведомление.
type
TForm1 = class(TForm)
..
protected
procedure Resizing(State: TWindowState); override;
....
procedure TForm1.Resizing(State: TWindowState);
begin
inherited;
case State of
TWindowState.wsNormal: ;
TWindowState.wsMinimized: ;
TWindowState.wsMaximized: ;
end;
end;
Обратите внимание, что уведомление может быть отправлено несколько раз для данного состояния, например, в то время как размер окна изменен или во время видимость меняется. Возможно, вам потребуется отследить предыдущее значение для обнаружения, когда состояние действительно изменено.
В зависимости от ваших требований вы также можете использовать событие OnResize
формы. Разница в том, что это событие запускается до того, как ОС уведомляет окно об изменении. VCL получает информацию о состоянии окна, вызывая GetWindowPlacement
, а TCustomForm
обрабатывает WM_WINDOWPOSCHANGING
.
Ниже приведен пример использования флага для отслеживания состояния предыдущего окна.
TForm1 = class(TForm)
..
private
FLastWindowState: TWindowState; // 0 -> wsNormal (initial value)
...
procedure TForm1.FormResize(Sender: TObject);
begin
if WindowState <> FLastWindowState then
case WindowState of
TWindowState.wsNormal: ;
TWindowState.wsMinimized: ;
TWindowState.wsMaximized: ;
end;
FLastWindowState := WindowState;
end;