Question

I'm using the OnIdle-event for some simple animations, and it works all right. The trouble, though, is when the user starts to move or resize the window, the OnIdle-event stops firing until the move/resize-operation is completed.

I need to detect when this happens, so that I can pause all animations. But how do I detect movement of the window?

Was it helpful?

Solution

I'd go with mghie comment : use a timer for the animation, and activate/deactivate it with message handlers.

In your case, you may want to add the following message handlers :

//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;

OTHER TIPS

I haven't tried this, but I'd say you could probably use WM_WINDOWPOSCHANGING to tell when the window is being moved. http://msdn.microsoft.com/en-us/library/ms632653(VS.85).aspx

Delphi code would be:

TSomeForm = class(TForm)
protected
  ...
  procedure WindowPosChanging(var Msg : TMessage); message WM_WINDOWPOSCHANGING;
  ...
end;
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top