AnimateWindow Slide - PullRequest
       6

AnimateWindow Slide

1 голос
/ 27 февраля 2010

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

void __fastcall TUsers::BitBtn1Click(TObject *Sender)
{
if (!pressed)
{
        Height=700;
        //AnimateWindow(Handle, 500, AW_CENTER | AW_SLIDE | AW_VER_POSITIVE);
        pressed=true;
}
else
{
        pressed=false;
        //AnimateWindow(Handle, 500, AW_CENTER | AW_SLIDE | AW_VER_NEGATIVE);
        Height=425;
}
}

модераторам: здесь нет бормочущих Builder или Delphi:)

Ответы [ 3 ]

3 голосов
/ 01 марта 2010

Если вы заинтересованы в управлении анимацией самостоятельно, вот пример кода, который мы написали для достижения этой цели. Это выглядит и прекрасно работает. Мы перемещаем Tform1 справа налево в элементе управления TPanel в главной форме. Мы гарантируем, что Self.Parent и DoubleBuffered правильно установлены в MyCreate. ShiftLeft, а затем ShiftRight делают всю работу. У некоторых пользователей мы столкнулись с проблемой, когда Self.Top смещался, поэтому мы проверяем Self.Top: = 0 при каждой итерации и при полном смещении. Это решило все странные проблемы, которые мы видели.

Надеюсь, это поможет!

{
  TForm1.MyCreate
  ---------------------------------------------------------------------------
}
constructor TForm1.MyCreate(AOwner: TComponent);
var
  OwnerControl: TWinControl;
begin
  inherited Create(AOwner);

  if Owner is TWinControl then
  begin
    OwnerControl := Owner as TWinControl;
    Self.Parent := OwnerControl;
  end;

  Self.Visible := false;
  Self.DoubleBuffered := true;
  Self.BorderStyle := bsNone;

end;

{
  TForm1.ShiftLeft
  ---------------------------------------------------------------------------
}
procedure TForm1.ShiftLeft;
var
  TicksStart: int64;
  InitLeftValue: integer;
  StartLeftValue: integer;
  NewLeftValue: integer;
  LeftValueDif: integer;
  RemainingTicks: int64;

begin
  Self.Top := 0;
  Self.Height := Self.Parent.ClientHeight;
  Self.Width := Self.Parent.ClientWidth;

  InitLeftValue := Self.Parent.Left;
  StartLeftValue := Self.Parent.Left + Self.Parent.ClientWidth;
  LeftValueDif := StartLeftValue - InitLeftValue;

  Self.Left := StartLeftValue;
  Self.Visible := true;

  TicksStart := GetTickCount();
  RemainingTicks := FadeTime;

  while RemainingTicks > 0 do
  begin
    NewLeftValue := (LeftValueDif * RemainingTicks) div FadeTime;
    Self.Left := Max(InitLeftValue, NewLeftValue);
    Self.Parent.Repaint;
    Self.Top := 0;
    Self.Repaint;

    RemainingTicks := FadeTime - int64(GetTickCount - TicksStart);
  end;

  if Self.Left > InitLeftValue then
    Self.Left := InitLeftValue;

  Self.Parent.Repaint;
  Self.Top := 0;
  Self.Repaint;
end;

{
  TForm1.ShiftRight
  ---------------------------------------------------------------------------
}
procedure TForm1.ShiftRight;
var
  TicksStart: int64;
  StartLeftValue: integer;
  EndLeftValue: integer;
  NewLeftValue: integer;
  LeftValueDif: integer;
  RemainingTicks: int64;

begin
  Self.Top := 0;
  StartLeftValue := Self.Left;
  EndLeftValue := Self.Left + Self.Width;
  LeftValueDif := EndLeftValue - StartLeftValue;

  TicksStart := GetTickCount();
  RemainingTicks := FadeTime;

  while RemainingTicks > 0 do
  begin
    NewLeftValue := (LeftValueDif * (FadeTime - RemainingTicks)) div FadeTime;
    Self.Left := Max(StartLeftValue, NewLeftValue);
    Self.Parent.Repaint;
    Self.Top := 0;
    Self.Repaint;

    RemainingTicks := FadeTime - int64(GetTickCount - TicksStart);
  end;

  if Self.Left < EndLeftValue then
    Self.Left := EndLeftValue;

  Self.Parent.Repaint;
  Self.Top := 0;
  Self.Repaint;
end;
1 голос
/ 29 августа 2012

Проверьте следующую ссылку для ответа и классной демонстрационной программы.

http://delphi.about.com/od/delphi-tips-2011/qt/hide-slide-fade-away-controls-delphi-form.htm

1 голос
/ 27 февраля 2010

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

Вместо этого вы должны последовательно увеличивать или уменьшать окно в цикле, пока не достигнете новой желаемой высоты.

...