Эй, товарищ, больше жизни!
Вратарская песня
Раз уж мы хотим, чтобы заставка наилучшим образом «презентовала» нашу программу, то давайте добавим ей привлекательности. Пусть она появляется не вдруг, а частями (товарищу Бендеру, конечно, такое решение вряд ли пришлось бы по вкусу, он ведь предпочитал всё сразу!), а для этого воспользуемся функцией WindowsAPIAnimateWindow, которая «анимирует» окно при появлении на экране и при исчезновении с него:
BOOL AnimateWindow(
HWND hwnd,
DWORD dwTime,
DWORDdwFlags
);
hwnd - дескриптор окна, в нашем случае для всех окон приложения это Handle.
dwTime- продолжительность эффекта в миллисекундах. dwFlags- константа, определяющая вид эффекта (может состоять из одного или нескольких флагов, соединённых логическим оператором OR): AW_HIDE- если указан этот флаг, то окно исчезает с экрана, если нет, то появляется;
Эффекты анимации:
AW_SLIDE- окно выдвигается по направлению, задаваемому флагом направления анимации (кроме AW_CENTER). Используется по умолчанию. Если флаг не задан, то изображение не выскальзывает, а раскручивается;
AW_BLEND- окно проявляется или угасает.
Направление анимации:
AW_CENTER- окно появляется из центра. Флаги направления не действуют;
AW_HOR_POSITIVE- окно появляется слева направо. Не действует с AW_CENTERи AW_BLEND;
AW_HOR_NEGATIVE- окно появляется справа налево. Не действует с AW_CENTERи AW_BLEND;
AW_VER_POSITIVE- окно появляется сверху вниз. Не действует с AW_CENTERи AW_BLEND;
AW_VER_NEGATIVE- окно появляется снизу вверх. Не действует с AWCENTERи AWBLEND.
Чтобы показать окно без эффектов анимации, можно воспользоваться другой функцией:
BOOL ShowWindow(HWND hWnd, int nCmdShow);
Эффект анимации уместно использовать при появлении окна на экране (событие OnShow) и при исчезновении с оного (событие OnCloseили On- Hide). Пусть у нас «эффектно» появляется и исчезает окно-заставка .
В текст модуля формы Unit2 добавим процедуру:
//ВЫВЕСТИ ОКНО НА ЭКРАН С ЭФФЕКТАМИ АНИМАЦИИ procedureTfrmSplash.FormShow(Sender: TObject); begin
AnimateWindow(Handle, DURATION, AW_CENTER);
//AnimateWindow(Handle, DURATION, AW_BLEND);
//AnimateWindow(Handle, DURATION, AW_SLIDE);
//AnimateWindow(Handle, DURATION, AW_HOR_POSITIVE or AW_SLIDE); //AnimateWindow(Handle, DURATION, AW_HOR_POSITIVE); //AnimateWindow(Handle, DURATION, AW_HOR_NEGATIVE or AW_ACTIVATE);
//AnimateWindow(Handle, DURATION, AW_VER_POSITIVE); //AnimateWindow(Handle, DURATION, AW_VER_NEGATIVE); end;
В данном случае окно будет расти из центра к краям - мы используем функцию AnimateWindow(Handle, DURATION, AW_CENTER), но вы можете поэкспериментировать и с другими аргументами. Например, раскомментируйте строчки (по очереди), запускайте программу и наблюдайте за появлением формы-заставки на экране.
Но прежде добавьте ещё немного кода в модуль:
Implementation const DURATION: integer=1000;
//СОЗДАТЬ ОКНО В ЦЕНТРЕ ЭКРАНА
procedure TfrmSplash.FormCreate(Sender: TObject); begin
left:= (screen.Width-width) div 2; top:= (screen.Height-height) div 2; end;
Подберите значение константы DURATIONпо своему вкусу, а затем допишите выделенную строку в процедуру, которая убирает форму с экрана, - теперь она будет исчезать гораздо эффектней, стягиваясь («коллапсируя») к центру:
//УБРАТЬ ФОРМУ, КОГДА КОНЧИТСЯ ВРЕМЯ
procedure TfrmSplash.FormHide(Sender: TObject); begin repeat
Application.ProcessMessages; until frmSplash.CloseQuery;
AnimateWindow(Handle, DURATION, AW_CENTER or AW_HIDE)
end;