Delphi: rileva l'inizio e la fine dello spostamento della finestra
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?
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;