Delphi: обнаружение начала и конца перемещения окна

Я использую onidle-event для некоторых простых анимаций, и он работает нормально. Проблема, однако, в том, что когда пользователь начинает перемещать или изменять размер окна, onidle-событие прекращает запуск до тех пор, пока не будет завершена операция перемещения/изменения размера.

Мне нужно определить, когда это произойдет, чтобы я мог приостановить все анимации. Но как я могу обнаружить движение Окна?

2 ответов


Я бы пошел с mghie комментарий: используйте таймер для анимации и активируйте/деактивируйте его с помощью обработчиков сообщений.

в вашем случае вы можете добавить следующие обработчики сообщений:

//fired when starting/ending a "move" or "size" window
procedure WMEnterSizeMove(var Message: TMessage) ; message WM_ENTERSIZEMOVE;
procedure WMExitSizeMove(var Message: TMessage) ; message WM_EXITSIZEMOVE;


  procedure TForm.WMEnterSizeMove(var msg: TMessage);
  begin
    AnimationTimer.Enabled := false;
    inherited;
  end;

  procedure TForm.WMExitSizeMove(var msg: TMessage);
  begin
    AnimationTimer.Enabled := true;
    inherited;
  end;

Я не пробовал это, но я бы сказал, что вы, вероятно, можете использовать WM_WINDOWPOSCHANGING, чтобы сказать, когда окно перемещается. http://msdn.microsoft.com/en-us/library/ms632653 (VS.85).aspx

код Delphi будет:

TSomeForm = class(TForm)
protected
  ...
  procedure WindowPosChanging(var Msg : TMessage); message WM_WINDOWPOSCHANGING;
  ...
end;