2016-10-18 8 views
5

Как я могу обнаружить изменения WindowState для потомка TCustomForm? Я хотел бы получать уведомление в любое время, когда свойство WindowState задано с другим значением.Как обнаружить изменения WindowState?

Я проверил, было ли событие или виртуальный метод внутри сеттера, но я не нашел ничего для достижения своей цели.

function ShowWindow; external user32 name 'ShowWindow'; 

procedure TCustomForm.SetWindowState(Value: TWindowState); 
const 
    ShowCommands: array[TWindowState] of Integer = 
    (SW_SHOWNORMAL, SW_MINIMIZE, SW_SHOWMAXIMIZED); 
begin 
    if FWindowState <> Value then 
    begin 
    FWindowState := Value; 
    if not (csDesigning in ComponentState) and Showing then 
     ShowWindow(Handle, ShowCommands[Value]); 
    end; 
end; 

ответ

7

Уведомление ОС посылает к окну, когда его состояние изменилось это 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; 

 Смежные вопросы

  • Нет связанных вопросов^_^