2011-12-24 2 views
5

У меня есть панель (нижняя выровненная) и некоторые элементы управления (выравнивание по клику).Delphi: AnimateWindow как в FireFox

Чтобы анимировать панель я использую:

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

В моем случае панель плавно Шкуры и только потом другие элементы управления принять это пространство.

Но я хочу, чтобы другие элементы управления двигались плавно и одновременно с панелью вниз.

Например, FireFox использует этот эффект.

Может ли кто-нибудь предложить мне что-нибудь полезное? Благодаря!

ответ

2

AnimateWindow - синхронная функция, она не вернется, пока анимация не закончится. Это означает, что в течение времени, указанного в параметре dwTime, код выравнивания не будет запущен, а выравниваемые элементы управления «alClient» останутся на месте до окончания анимации.

Я бы предложил вместо этого использовать таймер. Просто пример:

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

вы забыли application.proccessmessage внутри timer1timer. – AsepRoro

+1

@Roro - вам не нужны ProcessMessages в OnTimer. Как только обработчик события таймера вернется, приложение продолжит обработку сообщений. –

+0

oh good thats хороший вход для меня, потому что я никогда не знаю этого, спасибо – AsepRoro

-1

Удалить вторую линию

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

и оставить только

AnimateWindow(Panel.Handle, 1000, aw_hide or AW_SLIDE OR AW_VER_POSITIVE); 
Смежные вопросы