2009-05-05 5 views
7

J'utilise l'événement OnIdle pour des animations simples, et ça marche. Le problème, cependant, est que lorsque l'utilisateur commence à déplacer ou redimensionner la fenêtre, l'événement OnIdle arrête de se déclencher jusqu'à ce que l'opération de déplacement/redimensionnement soit terminée.Delphi: Détecter le début et la fin du déplacement de la fenêtre

J'ai besoin de détecter quand cela se produit, afin que je puisse mettre en pause toutes les animations. Mais comment puis-je détecter le mouvement de la fenêtre?

+5

L'utilisation OnIdle est pas vraiment une bonne idée, car il provoque la charge cpu 100% sur le noyau actif. Utilisez un événement timer à la place, ce qui présente deux avantages: Il se déclenchera également dans la boucle de message secondaire, de sorte que l'animation continue pendant move/resize (ce qui devrait être le cas lorsque le glissement de la fenêtre est actif); et vous serez en mesure de définir un nombre raisonnable de pas d'animation par seconde, quelle que soit la vitesse du système. – mghie

+0

Timer vs ralenti est un sujet intéressant. Les deux ont des avantages et des inconvénients, mais pour mes petites animations décoratives, onidle fera très bien. – Vegar

+0

De telles "petites animations décoratives", si l'utilisateur ne peut pas les désactiver, peuvent coûter beaucoup de temps sur un ordinateur portable. En outre, vous volez activement des cycles de cpu d'autres applications. Essayez-le pour vous-même, en réalité OnIdle a seulement par contre. – mghie

Répondre

8

je partirais avec mghie commentaire: utiliser une minuterie pour l'animation, et activer/désactiver avec les gestionnaires de messages.

Dans votre cas, vous pouvez ajouter les gestionnaires de messages suivants:

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

Je vais vérifier ces deux messages plus tard dans la journée. Je ne savais pas à leur sujet avant. Merci. – Vegar

+0

@LeGEC: Mais pourquoi désactiver l'animation du tout? Il n'interfère pas avec le déplacement/dimensionnement, et correspond au glissement de la fenêtre complète s'il est activé. – mghie

4

Je n'ai pas essayé cela, mais je dirais que vous pourriez probablement utiliser WM_WINDOWPOSCHANGING pour dire quand la fenêtre est déplacée. http://msdn.microsoft.com/en-us/library/ms632653(VS.85).aspx

code Delphi serait:

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