home *** CD-ROM | disk | FTP | other *** search
/ PC World 1999 February / PCWorld_1999-02_cd.bin / temacd / HotKeys / AniPlay.pas < prev    next >
Pascal/Delphi Source File  |  1997-04-11  |  7KB  |  251 lines

  1. unit AniPlay;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  7.   AniIcons;
  8.  
  9. type
  10.   TRepeatCount = 0..MAXINT;
  11.  
  12.   TAnimatedIconPlayer = class(TCustomControl)
  13.   private
  14.     FActiveFrame: Integer;
  15.     FAnimation  : TAnimatedIcons;
  16.     FAutoSize   : Boolean;
  17.     FBorderStyle: TBorderStyle;
  18.     FCentered   : Boolean;
  19.     FRepeatCount: TRepeatCount;
  20.     FOnStopped  : TNotifyEvent;
  21.     function  GetPlaying: Boolean;
  22.     procedure SetActiveFrame(Value: Integer);
  23.     procedure SetAnimation(Value: TAnimatedIcons);
  24.     procedure SetAutoSize(Value: Boolean);
  25.     procedure SetBorderStyle(Value: TBorderStyle);
  26.     procedure SetCentered(Value: Boolean);
  27.     procedure SetPlaying(Value: Boolean);
  28.     { Private declarations }
  29.   protected
  30.     { Protected declarations }
  31.     procedure CreateParams(var Params: TCreateParams); override;
  32.     procedure CMCtl3DChanged(var Msg: TMessage); message CM_CTL3DCHANGED;
  33.     procedure wmSize(var Msg: TWMSize); message WM_SIZE;
  34.     procedure Paint; override;
  35.  
  36.     procedure NewFrame(Sender: TObject; Frame: Integer);
  37.     procedure Stopped(Sender: TObject);
  38.     procedure AutoSizeComponent;
  39.     procedure DisplayFrame;
  40.   public
  41.     { Public declarations }
  42.     constructor Create(AOwner: TComponent); override;
  43.     destructor Destroy; override;
  44.  
  45.     procedure Play;
  46.     procedure Stop;
  47.   published
  48.     property Animation: TAnimatedIcons read FAnimation write SetAnimation;
  49.     property ActiveFrame: Integer read FActiveFrame write SetActiveFrame default 0;
  50.     property AutoSize: Boolean read FAutoSize write SetAutoSize default False;
  51.     property BorderStyle: TBorderStyle read FBorderStyle write SetBorderStyle default bsSingle;
  52.     property Centered: Boolean read FCentered write SetCentered default True;
  53.     property Color;
  54.     property Ctl3D;
  55.     property Enabled;
  56.     property ParentColor;
  57.     property ParentCtl3D;
  58.     property Playing: Boolean read GetPlaying write SetPlaying;
  59.     property RepeatCount: TRepeatCount read FRepeatCount write FRepeatCount default 0;
  60.     property TabOrder;
  61.     property TabStop;
  62.     property Visible;
  63.     property OnClick;
  64.     property OnDblClick;
  65.     property OnEnter;
  66.     property OnExit;
  67.     property OnKeyDown;
  68.     property OnKeyPress;
  69.     property OnKeyUp;
  70.     property OnMouseDown;
  71.     property OnMouseMove;
  72.     property OnMouseUp;
  73.     property OnStopped: TNotifyEvent read FOnStopped write FOnStopped;
  74.     { Published declarations }
  75.   end;
  76.  
  77. implementation
  78.  
  79. constructor TAnimatedIconPlayer.Create(AOwner: TComponent);
  80. begin
  81.   inherited Create(AOwner);
  82.   ControlStyle := [csCaptureMouse, csClickEvents, csOpaque, csDoubleClicks];
  83.   FActiveFrame := 0;
  84.   FAnimation := TAnimatedIcons.Create(is32x32);
  85.   FAnimation.OnStopped := Stopped;
  86.   FAnimation.OnNewFrame := NewFrame;
  87.   FAutoSize := False;
  88.   FBorderStyle := bsSingle;
  89.   FCentered := True;
  90.   FRepeatCount := 0;
  91.   Width := 40;
  92.   Height := 40;
  93. end;
  94.  
  95. destructor TAnimatedIconPlayer.Destroy;
  96. begin
  97.   FAnimation.Free;
  98.   inherited Destroy;
  99. end;
  100.  
  101. procedure TAnimatedIconPlayer.CreateParams(var Params: TCreateParams);
  102. begin
  103.   inherited CreateParams(Params);
  104.   with Params do
  105.    begin
  106.      Style := Style or WS_TABSTOP;
  107.      WindowClass.style := CS_DBLCLKS;
  108.      if FBorderStyle = bsSingle then
  109.       if NewStyleControls and Ctl3D then
  110.        begin
  111.          Style := Style and not WS_BORDER;
  112.          ExStyle := ExStyle or WS_EX_CLIENTEDGE;
  113.        end
  114.       else
  115.        Style := Style or WS_BORDER;
  116.    end;
  117. end;
  118.  
  119. function TAnimatedIconPlayer.GetPlaying: Boolean;
  120. begin
  121.   Result := Animation.Playing;
  122. end;
  123.  
  124. procedure TAnimatedIconPlayer.SetPlaying(Value : Boolean);
  125. begin
  126.   if Animation.Playing <> Value then
  127.    begin
  128.      if Value then Animation.Play(RepeatCount) else Animation.Stop;
  129.    end;
  130. end;
  131.  
  132. procedure TAnimatedIconPlayer.SetActiveFrame(Value: Integer);
  133. begin
  134.   if FActiveFrame<>Value then
  135.    begin
  136.      if (Value>=0) and (Value<=FAnimation.Count) then
  137.       begin
  138.         FActiveFrame := Value;
  139.         if not FAnimation.Playing then
  140.          if FActiveFrame>0 then
  141.           DisplayFrame
  142.          else
  143.           Invalidate;
  144.       end;
  145.    end;
  146. end;
  147.  
  148. procedure TAnimatedIconPlayer.SetAnimation(Value: TAnimatedIcons);
  149. begin
  150.   FAnimation.Assign(Value);
  151.   if FActiveFrame>FAnimation.Count then
  152.    FActiveFrame := FAnimation.Count;
  153.   if not FAnimation.Playing then Invalidate;
  154. end;
  155.  
  156. procedure TAnimatedIconPlayer.SetAutoSize(Value: Boolean);
  157. begin
  158.   if FAutoSize<>Value then
  159.    begin
  160.      FAutoSize := Value;
  161.      if FAutoSize then AutoSizeComponent;
  162.    end;
  163. end;
  164.  
  165. procedure TAnimatedIconPlayer.SetBorderStyle(Value: TBorderStyle);
  166. begin
  167.   if FBorderStyle <> Value then
  168.    begin
  169.      FBorderStyle := Value;
  170.      RecreateWnd;
  171.      if AutoSize then AutoSizeComponent;
  172.    end;
  173. end;
  174.  
  175. procedure TAnimatedIconPlayer.CMCtl3DChanged(var Msg: TMessage);
  176. begin
  177.   inherited;
  178.   RecreateWnd;
  179. end;
  180.  
  181. procedure TAnimatedIconPlayer.wmSize(var Msg: TWMSize);
  182. begin
  183.   inherited;
  184.   Invalidate;
  185. end;
  186.  
  187. procedure TAnimatedIconPlayer.SetCentered(Value: Boolean);
  188. begin
  189.   if FCentered <> Value then
  190.    begin
  191.      FCentered := Value;
  192.      Invalidate;
  193.    end;
  194. end;
  195.  
  196. procedure TAnimatedIconPlayer.AutoSizeComponent;
  197. var
  198.   Size: Integer;
  199. begin
  200.   if Animation.IconSize = is16x16 then Size := 16 else Size := 32;
  201.   SetBounds(Left, Top, Size + Width - ClientWidth, Size + Height - ClientHeight);
  202. end;
  203.  
  204. procedure TAnimatedIconPlayer.Play;
  205. begin
  206.   Animation.Play(RepeatCount);
  207. end;
  208.  
  209. procedure TAnimatedIconPlayer.Stop;
  210. begin
  211.   Animation.Stop;
  212. end;
  213.  
  214. procedure TAnimatedIconPlayer.Paint;
  215. begin
  216.   inherited Paint;
  217.   DisplayFrame;
  218. end;
  219.  
  220. procedure TAnimatedIconPlayer.Stopped(Sender: TObject);
  221. begin
  222.   if Assigned(FOnStopped) then FOnStopped(Self);
  223. end;
  224.  
  225. procedure TAnimatedIconPlayer.NewFrame(Sender: TObject; Frame: Integer);
  226. begin
  227.   FActiveFrame := Frame+1;
  228.   DisplayFrame;
  229. end;
  230.  
  231. procedure TAnimatedIconPlayer.DisplayFrame;
  232. var
  233.   IconSize, IconLeft, IconTop: Integer;
  234. begin
  235.   if (ActiveFrame=0) then Exit;
  236.   if Animation.IconSize = is16x16 then IconSize := 16 else IconSize := 32;
  237.   if Centered then
  238.    begin
  239.      IconLeft := (ClientWidth - IconSize) div 2;
  240.      IconTop := (ClientHeight - IconSize) div 2;
  241.    end
  242.   else
  243.    begin
  244.      IconLeft := 0;
  245.      IconTop := 0;
  246.    end;
  247.   Animation.DrawIcon(Canvas, IconLeft, IconTop, ActiveFrame-1, Color);
  248. end;
  249.  
  250. end.
  251.