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;
Удалить вторую строку
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);