2009-05-05 5 views
7

Estoy usando el evento OnIdle para algunas animaciones simples, y funciona bien. El problema, sin embargo, es cuando el usuario comienza a mover o cambiar el tamaño de la ventana, el evento OnIdle deja de disparar hasta que se completa la operación mover/cambiar tamaño.Delphi: detecta el inicio y el final del movimiento de ventana

Necesito detectar cuando sucede esto, para poder detener todas las animaciones. ¿Pero cómo detecto el movimiento de la ventana?

+5

Usando OnIdle no es realmente una buena idea, ya que hará que la carga de la CPU del 100% en el núcleo activo. Use un evento de temporizador en su lugar, que tiene dos ventajas: disparará también en el bucle de mensaje secundario, por lo que la animación continuará durante el movimiento/cambio de tamaño (que debería ocurrir cuando el arrastre de ventana completa está activo); y podrá establecer una cantidad razonable de pasos de animación por segundo, independientemente de la velocidad del sistema. – mghie

+0

Timer vs inactivo es un tema interesante. Ambos tienen pros y contras, pero para mis pequeñas animaciones decorativas, onidle hará muy bien. – Vegar

+0

Tales "pequeñas animaciones decorativas", si $ usuario no puede desactivarlas, pueden costar mucho tiempo de batería en una computadora portátil. Además, estás robando activamente ciclos de CPU de otras aplicaciones. Pruébelo usted mismo, en realidad, OnIdle tiene solo contras. – mghie

Respuesta

8

me gustaría ir con mghie comentario: utilizar un temporizador para la animación, y activar/desactivar con controladores de mensajes.

En su caso, es posible que desee agregar los siguientes controladores de mensajes:

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

Revisaré esos dos mensajes más tarde. No sabía sobre ellos antes. Gracias. – Vegar

+0

@LeGEC: ¿Pero por qué desactivar la animación? No interfiere con el movimiento/tamaño, y coincide con el arrastre completo de la ventana si está habilitado. – mghie

4

No he intentado esto, pero diría que probablemente puedas usar WM_WINDOWPOSCHANGING para saber cuándo se está moviendo la ventana. http://msdn.microsoft.com/en-us/library/ms632653(VS.85).aspx

código de Delphi sería:

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