2010-02-27 3 views
1

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

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

Если вы заинтересованы в управлении анимацией самостоятельно, вот образец кода, который мы написали, чтобы выполнить это. Он выглядит и отлично работает. Мы сдвигаем 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; 
+0

FadeTime - постоянная, которую мы установили в 300. –

+0

спасибо за хороший случай :) – Cynede

1

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

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

+0

Хм ... Я думаю, что сеют несколько примеров, когда AnimateWindow работает с кадрами ... Я думаю, что нужно отделить как-то свою форму в течение двух кадров, а затем использовать слайд-нибудь. – Cynede

+0

К сожалению, AnimateWindow работает только с окнами (aka TForms), а не с дочерними окнами (aka TFrames и TControls). –

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