Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Закрыть форму с анимацией

Delphi , Программа и Интерфейс , Размеры и Положение

Закрыть форму с анимацией

Оформил: DeeCo
Автор: http://www.swissdelphicenter.ch

var
   tutup: Boolean;
   i: Integer;

 procedure TForm1.Timer1Timer(Sender: TObject);
 var
   reg1, reg2: hrgn;
 begin
   if tutup = True then
   begin
     i := i + 10;
     reg1 := CreateRoundRectRgn(0 + i, 0 + i, Width - i, Height - i, 20, 20);
     SetWindowRgn(Handle, reg1, True);
   end;

   if i >= Width then
   begin
     tutup := False;
     i := 1;
   end;

   if tutup = False then
   begin
     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 then
     begin
       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
   else
   begin
     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.

Разбивка кода:

  1. В событии FormCreate переменная tutup устанавливается в True, что запускает процесс анимации. Таймер initially отключен.
  2. В событии Timer1Timer анимация реализуется двумя частями:
    • Первая часть создает круглый прямоугольник вокруг формы и устанавливает его как регион окна. Это дает видимость растущего круга.
    • Вторая часть создает два прямоугольника: один для левой половины формы и другой для правой половины. Эти регионы комбинируются с помощью CombineRgn для создания одиночного региона, который затем устанавливается как регион окна. Это дает видимость растущего прямоугольника из центра в стороны.
  3. В событии FormCloseQuery, когда пользователь пытается закрыть форму, она выводит диалоговое окно подтверждения, спрашивая, действительно ли он хочет выйти. Если пользователь выбирает Да, форма закрывается. Если пользователь выбирает Нет, таймер отключается и стиль рамки формы устанавливается в круглый прямоугольник, что дает видимость закрытия формы.

Код можно улучшить следующим образом:

  • Переменная tutup не необходима и может быть заменена флагом boolean.
  • Скорость анимации можно изменить, изменяя значение, добавляемое к i в событии таймера.
  • Диалоговое окно подтверждения можно заменить более пользовательски friendly сообщением.

Пример рефакторинга кода:

var
  i: Integer;
  reg1, reg2: hrgn;

procedure TForm1.FormCreate(Sender: TObject);
begin
  i := 0;
  timer1.Enabled := False;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  reg1, reg2: hrgn;
begin
  if i < Width then
  begin
    i := i + 10;
    reg1 := CreateRoundRectRgn(0 + i, 0 + i, Width - i, Height - i, 20, 20);
    SetWindowRgn(Handle, reg1, True);

    if i >= Width then
      timer1.Enabled := False;
  end
  else
  begin
    i := 0;
    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 then
      timer1.Enabled := False;
  end;
end;

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
var
  reg1: hrgn;
begin
  timer1.Enabled := True;
  if MessageDlg('Exit now?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then
    CanClose := True
  else
  begin
    CanClose := False;
    timer1.Enabled := False;
    reg1 := CreateRoundRectRgn(0, 0, Width, Height, 20, 20);
    SetWindowRgn(Handle, reg1, True);
  end;
end;

В статье описана реализация анимации закрытия формы с использованием Timer, Rgn и MessageDlg в Delphi, чтобы создать интересное и динамичное отображение процесса закрытия формы.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Размеры и Положение ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-01-29 03:26:06/0.0035669803619385/0