Карта сайтаСсылкиКонтакты

Хостинг


Анимация окна при открытии и закрытии

PDF Печать
Статьи

Кто-либо делал так, чтобы окно открывалось и закрывалось таким образом, чтобы оно сворачивалось в панель задач?

Это можно сделать, используя следующую функцию Windows API, определенную в Windows.pas:


function DrawAnimatedRects(hwnd: HWND; idAni: Integer;
  const lprcFrom, lprcTo: TRect): BOOL; stdcall;

Эта функция анимирует окно, чей дескриптор - hwnd. Оно преобразуется из прямоугольника, указанного в lprcFrom в прямоугольник, указанный в lprcTo. Эти прямоугольники обычно устанавливаются в границы окон источника и адресата в координатах экрана. Если Вы хотите, чтобы заголовок окна был анимирован, когда окно сворачивается в панель задач, нужно передеть IDANI_CAPTION как параметр idAni. Другие значения можно опустить, мы с ними дело не имеем, это просто тест.

Пример:

Создайте приложение, которое имеет кнопку, которая переключает немодальную форму Открыть - Закрыть, чтобы казалось, что форма "растет" из кнопки и полностью изменяет процесс, когда диалоговое окно будет закрыто.

Создайте новое приложение, назовите главную форму MainForm и сохраните ее как FmMain.pas. Добавьте TButton на MainForm с заголовком Скрыть/Показать Диалог. Теперь добавьте новую форму по имени DialogForm и сохраните ее как FmDialog.pas. Убедитесь, что DialogForm создается автоматически в файле проекта.

В главной форме потребуется три обработчика события: OnClick для кнопки, OnClose и OnShow для формы. Добавьте FmDialog в раздел uses главной формы, затем напишите обработчики событий:


procedure TMainForm.Button1Click(Sender: TObject);
begin
  // Переключатель видимости DialogForm. События OnShow / OnHide event
  // заботятся об анимации
  DialogForm.Visible := not DialogForm.Visible;
end;

procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  // Закрыть диалог (если открыт) с анимацией перед закрытием приложения
  DialogForm.Hide;
end;

procedure TMainForm.FormShow(Sender: TObject);
begin
  // Установить SourceCtrl здесь, а не в FormCreate, чтобы гарантировать создание DialogForm
  DialogForm.SourceCtrl := Button1;
end;

В обработчике события FormShow мы устанавливаем пользовательское свойство формы диалогового окна, которое содежит ссылку на кнопку для того, чтобы диалоговое окно знало как анимировать окно.

В модуле диалогового окна добавьте обработчики события OnShow и OnHide для формы и завершите раздел интерфейса формы диалога следующим образом:


type
  // Гарантируйте, что форма авто-создается в файле проекта
  TDialogForm = class(TForm)
    procedure FormHide(Sender: TObject);
    procedure FormShow(Sender: TObject);
  private
    fSourceCtrl: TControl;
    function GetSourceCtrlBounds: TRect;
    procedure AnimateDialog(const Src, Dest: TRect);
  public
    property SourceCtrl: TControl read fSourceCtrl write fSourceCtrl;
  end;

var
  DialogForm: TDialogForm;

Осуществите методы TDialogForm следующим образом:


procedure TDialogForm.AnimateDialog(const Src, Dest: TRect);
begin
  DrawAnimatedRects(Handle, IDANI_CAPTION, Src, Dest);
end;

procedure TDialogForm.FormHide(Sender: TObject);
begin
  if WindowState <> wsMinimized then
    AnimateDialog(BoundsRect, GetSourceCtrlBounds);
end;

procedure TDialogForm.FormShow(Sender: TObject);
begin
  if WindowState <> wsMinimized then
    AnimateDialog(GetSourceCtrlBounds, BoundsRect);
end;

function TDialogForm.GetSourceCtrlBounds: TRect;
begin
  Assert(Assigned(fSourceCtrl));
  Result.TopLeft := fSourceCtrl.ClientToScreen(Point(0, 0));
  Result.BottomRight := fSourceCtrl.ClientToScreen(
    Point(fSourceCtrl.Width, fSourceCtrl.Height)
  );
end;

AnimateDialog вызывает DrawAnimatedRects, чтобы выполнить мультипликацию. FormShow и FormHide сначала проверяют, не свернут ли диалог, а затем выполняют вызов AnimatedDialog, передавая границы прямоугольника диалога и кнопки как начало и конец мультипликации соответственно. GetSourceCtrlBounds просто вычисляет границы прямоугольника кнопки в координатах экрана. Это использует свойство SourceCtrl, чтобы получить ссылку на кнопку.


 

Добавить комментарий


Защитный код
Обновить