2005. április 6., szerda
How to animate a window while opening a form
Problem/Question/Abstract:
How to animate a window while opening a form
Answer:
This project uses two forms:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
type
TForm1 = class(TForm)
procedure FormClick(Sender: TObject);
private
procedure FocusAnimation(DC: HDC; AnimRect: TRect; Steps, Speed, Direction: Integer);
public
end;
const
FA_IN = 0;
FA_OUT = 1;
var
Form1: TForm1;
implementation
uses Unit2;
{$R *.DFM}
procedure TForm1.FormClick(Sender: TObject);
var
WRect: TRect;
begin
GetWindowRect(Form2.handle, WRect);
FocusAnimation(GetDC(0), WRect, 20, 10, FA_OUT);
{Open form2}
Form2.ShowModal;
end;
procedure TForm1.FocusAnimation(DC: HDC; AnimRect: TRect; Steps, Speed, Direction: Integer);
var
cv, animx, animy, animwidth, animheight: Integer;
xp, yp: Double;
FRect: TRect;
cancel: Boolean;
begin
{Steps = number of steps during open/close operation,
Speed = time between the steps,
Direction = inner/outer direction}
animx := AnimRect.left + (AnimRect.right - AnimRect.left) div 2;
animy := AnimRect.top + (AnimRect.bottom - AnimRect.top) div 2;
animwidth := AnimRect.right - AnimRect.left;
animheight := AnimRect.bottom - AnimRect.top;
xp := animwidth div 2 / Steps; {horizontal}
yp := animheight div 2 / Steps; {vertical}
if Direction = FA_OUT then
cv := 0
else
cv := Steps;
while not cancel do
begin
FRect := Rect(Round(animx - cv * xp), Round(animy - cv * yp),
Round(animx + cv * xp), Round(animy + cv * yp));
DrawFocusRect(DC, FRect);
Sleep(Speed);
DrawFocusRect(DC, FRect);
if Direction = FA_OUT then
begin
Inc(cv);
if cv > Steps then
cancel := True;
end
else
begin
Dec(cv);
if cv < 0 then
cancel := True;
end;
end;
end;
end.
Feliratkozás:
Megjegyzések küldése (Atom)
Nincsenek megjegyzések:
Megjegyzés küldése