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