2011-12-24 18 views
5

Tengo un panel (alineado abajo) y algunos controles (cliente alineado).Delphi: AnimateWindow como en FireFox

para animar el panel de uso:

AnimateWindow(Panel.Handle, 1000, aw_hide or AW_SLIDE OR AW_VER_POSITIVE); 
panel.Visible:=false; 

En mi caso el panel sin problemas cueros y sólo entonces otros controles tomar su espacio.

Pero quiero que otros controles se muevan suavemente y simultáneamente con el panel hacia abajo.

Por ejemplo, FireFox utiliza este efecto.

¿Alguien me puede recomendar algo útil? ¡Gracias!

Respuesta

2

AnimateWindow es una función sincrónica, no volverá hasta que finalice la animación. Eso significa que durante el tiempo especificado en el parámetro dwTime, no se ejecutará ningún código de alineación y los controles alineados con 'AlClient' permanecerán inmóviles hasta que finalice la animación.

Sugiero utilizar un temporizador en su lugar. Sólo un ejemplo:

type 
    TForm1 = class(TForm) 
    .. 
    private 
    FPanelHeight: Integer; 
    FPanelVisible: Boolean; 
.. 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    FPanelHeight := Panel1.Height; 
    Timer1.Enabled := False; 
    Timer1.Interval := 10; 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    Timer1.Enabled := True; 
    FPanelVisible := not FPanelVisible; 
end; 

procedure TForm1.Timer1Timer(Sender: TObject); 
const 
    Diff: array [Boolean] of Integer = (-1, 1); 
begin 
    Panel1.Height := Panel1.Height - Diff[FPanelVisible]; 
    Panel1.Visible := Panel1.Height > 0; 
    Timer1.Enabled := (Panel1.Height > 0) and (Panel1.Height < FPanelHeight); 
end; 
+0

olvida application.proccessmessage dentro timer1timer. – AsepRoro

+1

@Roro: no necesita procesar mensajes en un OnTimer. Una vez que el controlador de eventos del temporizador regrese, la aplicación continuará procesando los mensajes. –

+0

oh bueno eso es una buena entrada para mí porque nunca lo sé, gracias – AsepRoro

-1

Eliminar la segunda línea

AnimateWindow(Panel.Handle, 1000, aw_hide or AW_SLIDE OR AW_VER_POSITIVE); 
panel.Visible:=false; 

y dejar sólo

AnimateWindow(Panel.Handle, 1000, aw_hide or AW_SLIDE OR AW_VER_POSITIVE); 
Cuestiones relacionadas