2015-02-24 2 views
1

У меня есть простое приложение, которое содержит 2 формы, обе формы имеет следующие свойства:Отображение второй формы в полноэкранном режиме с слайд анимации

BorderStyle := bsnone; 
WindowState := wsMaximized; 

я установить эти свойства, чтобы сделать их обоих на весь экран. В главной форме есть кнопка, и когда я нажимаю Я хочу, чтобы показать вторую форму, в полноэкранном режиме с слайд-анимацией, так что я использовал этот код:

AnimateWindow(form2.Handle, 500, AW_ACTIVATE OR AW_SLIDE OR AW_HOR_NEGATIVE); 

Form2 находится в режиме автоматического создания и видимое свойство установлено в ложь ,

Проблема, когда я пробовал это, я видел нечетные результаты, анимация, но форма 2 появляется без каких-либо элементов управления и не покрывает весь экран.

Как исправить это, чтобы я мог отображать form2 как полный экран с анимацией слайдов?

Я использую xe5

ответ

1

AnimateWindow немного одиночкой. Он не играет хорошо с остальной частью команды в Delphi. Несмотря на то, что в документе MSDN для него говорится, что он показывает форму, на самом деле это не делает это должным образом. Это только анимация. Полагаю, что это будет хорошо, если вы выйдете из Windows API и узнаете все, что требуется.

Несколько вещей, которые нужно иметь в виду:

  • Я полагаю, вы заметили, что эффект скольжения не отображается должным образом с границами поддержкой.
  • Он не знает о свойстве WindowState формы, поэтому он не будет максимизировать форму, если вы этого захотите.
  • Она не показывает элементы управления после вызова, только графические элементы управления
  • Он ничего не знает о Delphi и как Delphi обрабатывает показ и скрытие его форм

Так хитрость заключается в том:

  • Уберите границы, как вы это сделали.
  • Перед тем, как показывать форму в первый раз, вы должны указать ее размер. Увидев, что вы хотите, чтобы он был максимальным, просто установите его на размер экрана , где он будет отображать и устанавливать его положение на четыре угла . Это можно сделать в OnCreate от Form2.
  • Так при нажатии на кнопку, вы сначала вызвать AnimateWindow затем вызвать нормальный Form2.Show

Там могут быть и другие исправления, но это один я знаю.

2

на основе MSN
https://msdn.microsoft.com/en-us/library/windows/desktop/ms632669(v=vs.85).aspx
есть много проблем, сообщили об использовании этой функции. Поэтому я рекомендую вам пойти и реализовать анимацию самостоятельно.

Поскольку вы заинтересованы только в скользящей информации делать дальше:

Кулака изменить размер формы, чтобы вписаться в размер монитора.

MyForm.Width := Screen.Width; 
MyForm.Height := Screen.Height; 

Затем переместите форму на край экрана, с которого вы хотите начать анимацию. При этом держите по крайней мере один пиксель формы внутри видимой области монитора.

//Strating animation from left border 
MyForm.Left := 1 - MyForm.Width; 
MyForm.Top := 0; 

//Starting from right border 
MyForm.Left := MyForm.Width - 1; 
MyForm.Top := 0; 

//Starting from top border 
MyForm.Left := 0; 
MyForm.Top := 1 - MyForm.Height; 

//Starting from bottom border 
MyForm.Left := 0; 
MyForm.Top := MyForm.Height - 1; 

После того, как ваши позиционируют свою форму в стартовом possition сделать его видимым и включить таймер, который будет beused обновлять формы позиции несколько раз (одушевленных), пока он не попадет в нужное положение

MyForm.Show; 
AniTimer.Enabled; 

И начать анимацию который в основном просто обновляет ваше положение формы с помощью простого таймера

//Left to right animation 
procedure MyForm.AniTimerOnTimer(Sender: TObject); 
//Constant used to define by how many pixels will the form be moved 
//on each timer interval 
const MoveStep: Integer = 5; 
begin 
    if MyForm.Left < MoveStep then 
    begin 
    MyForm.Left := MyForm.Left + MoveStep; 
    end; 
    else 
    begin 
    MyForm.Left := 0; 
    AniTimer.Enabled := False; 
    end; 
end; 

Используйте аналогичный подход для других направлений, если необходимо.

Вместо определения MoveStep как константы вы можете сделать это как переменную, а затем динамически вычислить ее значение, чтобы анимация была завершена с помощью N шагов.

MoveStep := Screen.Width div N; 

Если вы хотите иметь диагональную анимацию, вам понадобятся две переменные MoveStep. Один для горизонтального и один для вертикальной оси. И вам нужно, чтобы убедиться, что оба рассчитывают для того, чтобы закончить анимацию определенного количества шагов

MoveStepX := Screen.Width div N; 
MoveStepY := Screen.Height div N; 

Так что теперь вы можете контролировать скорость анимации, изменяя MoveStep и интервал таймера.

Примечание. Я не рекомендую устанавливать интервал таймера на маленький. Зачем?

Как известно, возможно, что компонент TTimer не известен своей акроностью, поэтому он может привести к заметному изменению скорости вашей анимации.

Кроме того, изменение позиции формы несколько раз woulrd требует, чтобы часть ее была переименована в hwen, она попала в визуальный ярость, чтобы она могла генерировать значительную нагрузку на процессор.

Перемещение fomr несколько раз и с большими приращениями может значительно снизить нагрузку на процессор, все еще сохраняя адекватную насыщенность.

Так что сделайте некоторое тестирование, чтобы найти наилучшую комбинацию таймера и шаг шага.

2

Ваша проблема в том, что перед тем, как Form2 впервые показан, VCL не создает окна API для оконных элементов управления. Потому что это не нужно. При вызове AnimateWindow помните, что «visible» по-прежнему установлен на false.

Ниже приведено не очень изящное обходное решение, которое устанавливает «видимое», а форма имеет ширину и высоту. В нем также рассматривается дополнительная проблема, о которой я не знаю, почему у вас ее нет. Это то, что я не могу анимировать максимально развернутое окно, что кажется мне логичным - окно с максимизированным не перемещается. В любом случае, чтобы проверить его, я предлагаю установить «wsNormal» как WindowState во время разработки.

procedure TForm1.Timer1Timer(Sender: TObject); 
begin 
    if Form2.Visible then begin 
    Form2.WindowState := wsNormal; 
    AnimateWindow(Form2.Handle, 500, AW_HIDE OR AW_SLIDE OR AW_HOR_NEGATIVE); 
    Form2.Close; 
    end else begin 
    Form2.Width := 0; 
    Form2.Height := 0; 
    Form2.Visible := True; 
    ShowWindow(Form2.Handle, SW_HIDE); 

    Form2.WindowState := wsNormal; 
    Form2.Width := Form2.Monitor.Width; 
    Form2.Height := Form2.Monitor.Height; 
    AnimateWindow(form2.Handle, 500, AW_ACTIVATE or AW_SLIDE OR AW_HOR_NEGATIVE); 
    Form2.WindowState := wsMaximized; 
    end; 
end; 
+0

@Wel - Вы попробовали это? –

Смежные вопросы