📄 jvgifctrl.pas
字号:
if FImage.Palette <> 0 then
begin
SavePal := SelectPalette(Canvas.Handle, FImage.Palette, False);
RealizePalette(Canvas.Handle);
end;
if not UseCache then
begin
if (FImage.Frames[FImage.FrameIndex].TransparentColor <> clNone) then
begin
TransColor := GetNearestColor(Canvas.Handle,
ColorToRGB(FImage.Frames[FImage.FrameIndex].TransparentColor));
Canvas.Brush.Color := PaletteColor(TransColor);
end
else
if (FImage.BackgroundColor <> clNone) and FImage.Transparent then
Canvas.Brush.Color := PaletteColor(FImage.BackgroundColor)
else
Canvas.Brush.Color := PaletteColor(clWindow);
Canvas.FillRect(Bounds(0, 0, Width, Height));
while First > 0 do
begin
if (FImage.ScreenWidth = FImage.Frames[First].Width) and
(FImage.ScreenHeight = FImage.Frames[First].Height) then
begin
if (FImage.Frames[First].TransparentColor = clNone) or
((FImage.Frames[First].DisposalMethod = dmRestoreBackground) and
(First < Last)) then
Break;
end;
Dec(First);
end;
for I := First to Last - 1 do
begin
with FImage.Frames[I] do
case DisposalMethod of
dmUndefined, dmLeave:
Draw(Canvas, Bounds(Origin.X, Origin.Y, Width, Height), True);
dmRestoreBackground:
if I > First then
Canvas.FillRect(Bounds(Origin.X, Origin.Y, Width, Height));
dmRestorePrevious:
begin { do nothing }
end;
end;
end;
end
else
begin
with FImage.Frames[FCacheIndex] do
if DisposalMethod = dmRestoreBackground then
Canvas.FillRect(Bounds(Origin.X, Origin.Y, Width, Height));
end;
with FImage.Frames[Last] do
Draw(Canvas, Bounds(Origin.X, Origin.Y, Width, Height), True);
if (not UseCache) and (TransColor <> clNone) and FTransparent then
begin
TransparentColor := PaletteColor(TransColor);
Transparent := True;
end;
if FImage.Palette <> 0 then
SelectPalette(Canvas.Handle, SavePal, False);
end;
FCache := Result;
FCacheIndex := Index;
FTransColor := TransColor;
Result.Canvas.Unlock;
except
Result.Canvas.Unlock;
if not UseCache then
Result.Free;
raise;
end;
end;
function TJvGIFAnimator.GetPalette: HPALETTE;
begin
Result := 0;
if not FImage.Empty then
Result := FImage.Palette;
end;
procedure TJvGIFAnimator.ImageChanged(Sender: TObject);
begin
Lock;
try
FCacheIndex := -1;
FCache.Free;
FCache := nil;
FTransColor := clNone;
FFrameIndex := FImage.FrameIndex;
if (FFrameIndex >= 0) and (FImage.Count > 0) then
FTimer.Interval := GetDelayTime(FFrameIndex);
finally
Unlock;
end;
PictureChanged;
Change;
end;
procedure TJvGIFAnimator.Paint;
begin
PaintImage;
if FImage.Transparent or FImage.Empty then
PaintDesignRect;
end;
procedure TJvGIFAnimator.ReadJvxAnimate(Reader: TReader);
begin
Animate := Reader.ReadBoolean;
end;
procedure TJvGIFAnimator.SetAnimate(Value: Boolean);
begin
if FAnimate <> Value then
begin
if Value then
begin
FTimer.OnTimer := TimerExpired;
FTimer.Enabled := True;
FAnimate := FTimer.Enabled;
Start;
end
else
begin
FTimer.Enabled := False;
FTimer.OnTimer := nil;
FAnimate := False;
Stop;
PictureChanged;
end;
end;
end;
procedure TJvGIFAnimator.SetAsyncDrawing(Value: Boolean);
begin
if FAsyncDrawing <> Value then
begin
Lock;
try
if Assigned(FTimer) then
FTimer.SyncEvent := not Value;
FAsyncDrawing := Value;
finally
Unlock;
end;
end;
end;
procedure TJvGIFAnimator.SetCenter(Value: Boolean);
begin
if Value <> FCenter then
begin
Lock;
try
FCenter := Value;
finally
Unlock;
end;
PictureChanged;
if Animate then
Repaint;
end;
end;
procedure TJvGIFAnimator.SetFrameIndex(Value: Integer);
begin
if Value <> FFrameIndex then
begin
if (Value < FImage.Count) and (Value >= 0) then
begin
Lock;
try
FFrameIndex := Value;
if (FFrameIndex >= 0) and (FImage.Count > 0) then
FTimer.Interval := GetDelayTime(FFrameIndex);
finally
Unlock;
end;
FrameChanged;
PictureChanged;
end;
end;
end;
procedure TJvGIFAnimator.SetImage(Value: TJvGIFImage);
begin
Lock;
try
FImage.Assign(Value);
finally
Unlock;
end;
end;
procedure TJvGIFAnimator.SetStretch(Value: Boolean);
begin
if Value <> FStretch then
begin
Lock;
try
FStretch := Value;
finally
Unlock;
end;
PictureChanged;
if Animate then
Repaint;
end;
end;
procedure TJvGIFAnimator.SetTransparent(Value: Boolean);
begin
if Value <> FTransparent then
begin
Lock;
try
FTransparent := Value;
finally
Unlock;
end;
PictureChanged;
if Animate then
Repaint;
end;
end;
procedure TJvGIFAnimator.Start;
begin
if Assigned(FOnStart) then
FOnStart(Self);
end;
procedure TJvGIFAnimator.Stop;
begin
if Assigned(FOnStop) then
FOnStop(Self);
end;
procedure TJvGIFAnimator.TimerDeactivate;
var
F: TCustomForm;
begin
SetAnimate(False);
if csDesigning in ComponentState then
begin
F := GetParentForm(Self);
if (F <> nil) and (F.Designer <> nil) then
F.Designer.Modified;
end;
end;
procedure TJvGIFAnimator.TimerExpired(Sender: TObject);
begin
if csPaintCopy in ControlState then
Exit;
if Visible and (FImage.Count > 1) and (Parent <> nil) and
Parent.HandleAllocated then
begin
Lock;
try
if FFrameIndex < FImage.Count - 1 then
Inc(FFrameIndex)
else
FFrameIndex := 0;
Canvas.Lock;
try
FTimerRepaint := True;
if AsyncDrawing and Assigned(FOnFrameChanged) then
FTimer.Synchronize(FrameChanged)
else
FrameChanged;
DoPaintControl;
finally
FTimerRepaint := False;
Canvas.Unlock;
if (FFrameIndex >= 0) and (FFrameIndex < FImage.Count) then
FTimer.Interval := GetDelayTime(FFrameIndex);
end;
if not FLoop and (FFrameIndex = 0) then
if AsyncDrawing then
FTimer.Synchronize(TimerDeactivate)
else
TimerDeactivate;
finally
Unlock;
end;
end;
end;
{$IFDEF UNITVERSIONING}
initialization
RegisterUnitVersion(HInstance, UnitVersioning);
finalization
UnregisterUnitVersion(HInstance);
{$ENDIF UNITVERSIONING}
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -