Анимация окна при открытии и закрытии
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, чтобы получить ссылку на кнопку.
Комментарии