GDI+支持多种图像格式的操作,其中的gif和tiff格式图像可包含多帧(页)图片,在一般的显示中,只能显示图像的第一帧(页)图片。.NET专门有个ImageAnimator类,用来播放此类图像,在Delphi中,我们也可利用GDI+编制自己的多帧(页)图像动画播放类。
笔者写了一个多帧(页)图像动画播放类,为了代码重用,先写了一个基类TImageAnimatBase,下面是该类的源码,类的主要方法和属性已经在源码中说明:



















































































































































































if not CanAnimate then Exit;
P:=FDelays;
forI:=0toFrameCount-1do
begin
P^:=100;
Inc(P);
end;
end;

procedureTImageAnimatBase.SetDelays(ADelays:arrayofLongWord);
var
I,Count:Integer;
P:PLongWord;
begin
ifnotCanAnimatethenExit;
Count:=Length(ADelays);
ifCount=0then
begin
SetDefaultDelays;
Exit;
end;
P:=FDelays;
forI:=0toFrameCount-1do
begin
ifI<Countthen
P^:=ADelays[I]
else
P^:=ADelays[Count-1];
Inc(P);
end;
end;

procedureTImageAnimatBase.SetFrameCount(constCount:Integer);
begin
ifFFrameCount<>Countthen
begin
ifAssigned(FDelays)then
begin
FreeMem(FDelays);
FDelays:=nil;
end;
FFrameCount:=Count;
ifFFrameCount>1then
GetMem(FDelays,FFrameCount*Sizeof(LongWord));
end;
end;

procedureTImageAnimatBase.SetLoopCount(constValue:Integer);
begin
ifFLoopCount<>Valuethen
ifValue<0then
FLoopCount:=GetDefaultLoopCount
else
FLoopCount:=Value;
end;

procedureTImageAnimatBase.SetPlay(constValue:Boolean);
begin
if(Play<>Value)and(notValueorCanAnimate)then
begin
ifValuethen
begin
FFrameIndex:=0;
FLoopIndex:=0;
end;
FTimer.Enabled:=Value;
end;
end;

procedureTImageAnimatBase.TimerOnTimer(Sender:TObject);
var
P:PLongWord;
begin
P:=FDelays;
Inc(P,FrameIndex);
ifP^<>FTimer.Intervalthen
FTimer.Interval:=P^;
DoUpdateFrames;
if(FLoopCount<>0)and(FLoopIndex=LoopCount)then
Play:=False;
end;

procedureTImageAnimatBase.UpdateFrames;
begin
ifCanAnimatethen
DoUpdateFrames;
end;

end.

























































































下面是基于GDI+的TImageAnimatBase派生类TGpImageAnimator源码:
































