var
tutup: Boolean;
i: Integer;
procedure TForm1.Timer1Timer(Sender: TObject);
var
reg1, reg2: hrgn;
beginif tutup = True thenbegin
i := i + 10;
reg1 := CreateRoundRectRgn(0 + i, 0 + i, Width - i, Height - i, 20, 20);
SetWindowRgn(Handle, reg1, True);
end;
if i >= Width thenbegin
tutup := False;
i := 1;
end;
if tutup = False thenbegin
i := i + 10;
reg1 := CreateRectRgn(0, 0, (Width div 2) - i, Height);
reg2 := CreateRectRgn((Width div 2) + i, 0, Width, Height);
CombineRgn(reg1, reg1, reg2, rgn_or);
SetWindowRgn(Handle, reg1, True);
if i >= Width div 2 thenbegin
tutup := True;
i := 1;
end;
end;
end;
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
var
reg1: hrgn;
begin
i := 1;
timer1.Enabled := True;
if MessageDlg('Exit now ?',
mtConfirmation, [mbYes, mbNo], 0) = mrYes then
CanClose := True
elsebegin
CanClose := False;
timer1.Enabled := False;
reg1 := CreateRoundRectRgn(0, 0, Width, Height, 0, 0);
SetWindowRgn(Handle, reg1, True);
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
tutup := True;
timer1.Enabled := False;
end;
Перевод кода на русский язык:
Данный код является частью приложения Delphi, которое создает форму с анимацией при ее закрытии или минимальизации. Анимация достигается путем изменения стиля рамки формы с помощью функции Windows API SetWindowRgn.
Разбивка кода:
В событии FormCreate переменная tutup устанавливается в True, что запускает процесс анимации. Таймер initially отключен.
В событии Timer1Timer анимация реализуется двумя частями:
Первая часть создает круглый прямоугольник вокруг формы и устанавливает его как регион окна. Это дает видимость растущего круга.
Вторая часть создает два прямоугольника: один для левой половины формы и другой для правой половины. Эти регионы комбинируются с помощью CombineRgn для создания одиночного региона, который затем устанавливается как регион окна. Это дает видимость растущего прямоугольника из центра в стороны.
В событии FormCloseQuery, когда пользователь пытается закрыть форму, она выводит диалоговое окно подтверждения, спрашивая, действительно ли он хочет выйти. Если пользователь выбирает Да, форма закрывается. Если пользователь выбирает Нет, таймер отключается и стиль рамки формы устанавливается в круглый прямоугольник, что дает видимость закрытия формы.
Код можно улучшить следующим образом:
Переменная tutup не необходима и может быть заменена флагом boolean.
Скорость анимации можно изменить, изменяя значение, добавляемое к i в событии таймера.
Диалоговое окно подтверждения можно заменить более пользовательски friendly сообщением.
В статье описана реализация анимации закрытия формы с использованием Timer, Rgn и MessageDlg в Delphi, чтобы создать интересное и динамичное отображение процесса закрытия формы.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS