Domanda

Sto usando l'evento OnIdle per alcune semplici animazioni e funziona bene. Il problema, tuttavia, è quando l'utente inizia a spostare o ridimensionare la finestra, l'evento OnIdle smette di sparare fino al completamento dell'operazione di spostamento / ridimensionamento.

Devo rilevare quando ciò accade, in modo da poter mettere in pausa tutte le animazioni. Ma come posso rilevare il movimento della finestra?

È stato utile?

Soluzione

Vorrei andare con mghie commento: utilizzare un timer per l'animazione e attivarlo / disattivarlo con i gestori di messaggi.

Nel tuo caso, potresti voler aggiungere i seguenti gestori di messaggi:

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

Altri suggerimenti

Non l'ho provato, ma direi che probabilmente potresti usare WM_WINDOWPOSCHANGING per dire quando la finestra viene spostata. http://msdn.microsoft.com/en-us /library/ms632653(VS.85).aspx

Il codice Delphi sarebbe:

TSomeForm = class(TForm)
protected
  ...
  procedure WindowPosChanging(var Msg : TMessage); message WM_WINDOWPOSCHANGING;
  ...
end;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top