鱼C论坛

 找回密码
 立即注册
查看: 2939|回复: 11

哪位知道delphi安装界面的动画效果是怎么实现的?

[复制链接]
发表于 2013-12-13 21:41:19 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
如图:
8JF`~`TD@L{4LI@VYTQIZ7K.jpg

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-12-17 22:20:48 | 显示全部楼层
12.gif

看截图,CnPack组件包里的CnWaterImage.pas就有实现方法了
  1. {******************************************************************************}
  2. {                       CnPack For Delphi/C++Builder                           }
  3. {                     中国人自己的开放源码第三方开发包                         }
  4. {                   (C)Copyright 2001-2012 CnPack 开发组                       }
  5. {                   ------------------------------------                       }
  6. {                                                                              }
  7. {            本开发包是开源的自由软件,您可以遵照 CnPack 的发布协议来修        }
  8. {        改和重新发布这一程序。                                                }
  9. {                                                                              }
  10. {            发布这一开发包的目的是希望它有用,但没有任何担保。甚至没有        }
  11. {        适合特定目的而隐含的担保。更详细的情况请参阅 CnPack 发布协议。        }
  12. {                                                                              }
  13. {            您应该已经和开发包一起收到一份 CnPack 发布协议的副本。如果        }
  14. {        还没有,可访问我们的网站:                                            }
  15. {                                                                              }
  16. {            网站地址:http://www.cnpack.org                                   }
  17. {            电子邮件:master@cnpack.org                                       }
  18. {                                                                              }
  19. {******************************************************************************}

  20. unit CnWaterImage;
  21. {* |<PRE>
  22. ================================================================================
  23. * 软件名称:界面控件包
  24. * 单元名称:水波效果图像控件
  25. * 单元作者:周劲羽 (zjy@cnpack.org)
  26. * 备    注:
  27. * 开发平台:PWinXP SP2 + Delphi 5.01
  28. * 兼容测试:
  29. * 本 地 化:该单元中的字符串均符合本地化处理方式
  30. * 单元标识:$Id: CnWaterImage.pas 1146 2012-10-24 06:25:41Z liuxiaoshanzhashu@gmail.com $
  31. * 修改记录:2008.11.17 V1.1
  32. *               笑三少增加控制水滴初始半径与荡漾快慢的两个属性
  33. *           2005.11.22 V1.0
  34. *               创建控件
  35. ================================================================================
  36. |</PRE>}

  37. interface

  38. {$I CnPack.inc}

  39. uses
  40.   Windows, Messages, SysUtils, Classes, Graphics, Controls, ExtCtrls,
  41.   Math, CnWaterEffect;

  42. const
  43.   csDefRandomDelay = 800;
  44.   csDefRandomBlob = 500;
  45.   csDefTrackBlob = 100;
  46.   csDefClickBlob = 250;
  47.   csDefRadius = 1;
  48.   csDefInterval = 50;

  49. type

  50. { TCnWaterImage }

  51.   TCnRenderEvent = procedure (Sender: TObject; ABitmap: TBitmap) of object;

  52.   TCnWaterImage = class(TGraphicControl)
  53.   {* 水波效果图像控件 }
  54.   private
  55.     FPicture: TPicture;
  56.     FTimer: TTimer;
  57.     FSrcBmp: TBitmap;
  58.     FDstBmp: TBitmap;
  59.     FWater: TCnWaterEffect;
  60.     FDrawing: Boolean;
  61.     FRadius : Integer;
  62.     FRandomDelay: Integer;
  63.     FTrackBlob: Integer;
  64.     FClickBlob: Integer;
  65.     FRandomBlob: Integer;
  66.     FOnAfterRender: TCnRenderEvent;
  67.     FOnBeforeRender: TCnRenderEvent;
  68.     procedure PictureChanged(Sender: TObject);
  69.     procedure SetPicture(Value: TPicture);
  70.     procedure UpdateWaterData;
  71.     procedure OnTimer(Sender: TObject);
  72.     function GetCanvas: TCanvas;
  73.     function GetDamping: TWaterDamping;
  74.     procedure SetDamping(const Value: TWaterDamping);
  75.     function GetInterval: Cardinal;
  76.     procedure SetInterval(Value: Cardinal);
  77.   protected
  78.     function CanAutoSize(var NewWidth, NewHeight: Integer): Boolean; override;
  79.     procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
  80.       X, Y: Integer); override;
  81.     procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
  82.     procedure Loaded; override;
  83.     procedure Resize; override;
  84.     procedure Paint; override;
  85.   public
  86.     constructor Create(AOwner: TComponent); override;
  87.     destructor Destroy; override;
  88.     procedure ClearWater;
  89.     {* 清空画面上的水滴效果 }
  90.     procedure Blob(x, y: Integer; ARadius, AHeight: Integer);
  91.     {* 在画面上产生一个水滴效果。x, y 为坐标,如果为 -1 表示随机点。ARadius 和
  92.       AHeight 为初始半径和效果幅度 }
  93.     property Canvas: TCanvas read GetCanvas;
  94.     {* 画布属性,只在 OnBeforeRender 事件中有用 }
  95.   published
  96.     property Align;
  97.     property Anchors;
  98.     property AutoSize;
  99.     property ClickBlob: Integer read FClickBlob write FClickBlob default csDefClickBlob;
  100.     {* 点击画面时产生的水滴效果幅度,0 表示禁用 }
  101.     property Constraints;
  102.     property Damping: TWaterDamping read GetDamping write SetDamping default csDefDamping;
  103.     {* 水滴阻尼系数 }
  104.     property DragCursor;
  105.     property DragKind;
  106.     property DragMode;
  107.     property Enabled;
  108.     property Radius : Integer read FRadius write FRadius default csDefRadius;
  109.     {* 水波初始半径,默认为 1 }
  110.     property Interval : Cardinal read GetInterval write SetInterval default csDefInterval;
  111.     {* 波纹荡漾快慢的间隔时间,单位毫秒,默认 50 }
  112.     property ParentShowHint;
  113.     property Picture: TPicture read FPicture write SetPicture;
  114.     {* 背景图像 }
  115.     property PopupMenu;
  116.     property RandomBlob: Integer read FRandomBlob write FRandomBlob default csDefRandomBlob;
  117.     {* 随机产生的水滴最大幅度,0 表示禁用 }
  118.     property RandomDelay: Integer read FRandomDelay write FRandomDelay default csDefRandomDelay;
  119.     {* 随机产生水滴的延时 }
  120.     property ShowHint;
  121.     property TrackBlob: Integer read FTrackBlob write FTrackBlob default csDefTrackBlob;
  122.     {* 鼠标移动轨迹下水滴的幅度,0 表示禁用 }
  123.     property Visible;
  124.     property OnAfterRender: TCnRenderEvent read FOnAfterRender write FOnAfterRender;
  125.     {* 画面绘制后事件 }
  126.     property OnBeforeRender: TCnRenderEvent read FOnBeforeRender write FOnBeforeRender;
  127.     {* 画面绘制前事件 }
  128.     property OnClick;
  129.     property OnContextPopup;
  130.     property OnDblClick;
  131.     property OnDragDrop;
  132.     property OnDragOver;
  133.     property OnEndDock;
  134.     property OnEndDrag;
  135.     property OnMouseDown;
  136.     property OnMouseMove;
  137.     property OnMouseUp;
  138.     property OnStartDock;
  139.     property OnStartDrag;
  140.   end;

  141. implementation

  142. { TCnWaterImage }

  143. constructor TCnWaterImage.Create(AOwner: TComponent);
  144. begin
  145.   inherited Create(AOwner);
  146.   ControlStyle := ControlStyle + [csReplicatable, csOpaque];
  147.   FPicture := TPicture.Create;
  148.   FPicture.OnChange := PictureChanged;
  149.   FTimer := TTimer.Create(Self);
  150.   FTimer.Interval := csDefInterval;
  151.   FTimer.OnTimer := OnTimer;
  152.   FTimer.Enabled := True;
  153.   FSrcBmp := TBitmap.Create;
  154.   FDstBmp := TBitmap.Create;
  155.   FWater := TCnWaterEffect.Create;
  156.   FRandomDelay := csDefRandomDelay;
  157.   FRandomBlob := csDefRandomBlob;
  158.   FTrackBlob := csDefTrackBlob;
  159.   FClickBlob := csDefClickBlob;
  160.   Height := 105;
  161.   Width := 105;
  162. end;

  163. destructor TCnWaterImage.Destroy;
  164. begin
  165.   FPicture.Free;
  166.   FTimer.Free;
  167.   FSrcBmp.Free;
  168.   FDstBmp.Free;
  169.   FWater.Free;
  170.   inherited Destroy;
  171. end;

  172. procedure TCnWaterImage.Paint;
  173. var
  174.   Save: Boolean;
  175. begin
  176.   Canvas.Lock;
  177.   if csDesigning in ComponentState then
  178.     with inherited Canvas do
  179.     begin
  180.       Pen.Style := psDash;
  181.       Brush.Style := bsClear;
  182.       Rectangle(0, 0, Width, Height);
  183.     end;
  184.   Save := FDrawing;
  185.   FDrawing := True;
  186.   try
  187.     if Picture.Graphic <> nil then
  188.       with inherited Canvas do
  189.         Draw(0, 0, FDstBmp);
  190.   finally
  191.     Canvas.UnLock;
  192.     FDrawing := Save;
  193.   end;
  194. end;

  195. function TCnWaterImage.CanAutoSize(var NewWidth, NewHeight: Integer): Boolean;
  196. begin
  197.   Result := True;
  198.   if not (csDesigning in ComponentState) or (Picture.Width > 0) and
  199.     (Picture.Height > 0) then
  200.   begin
  201.     if Align in [alNone, alLeft, alRight] then
  202.       NewWidth := Picture.Width;
  203.     if Align in [alNone, alTop, alBottom] then
  204.       NewHeight := Picture.Height;
  205.   end;
  206. end;

  207. procedure TCnWaterImage.Resize;
  208. begin
  209.   UpdateWaterData;
  210.   inherited;
  211. end;

  212. procedure TCnWaterImage.UpdateWaterData;
  213. begin
  214.   if [csLoading, csDestroying] * ComponentState = [] then
  215.   begin
  216.     FDstBmp.Canvas.Lock;
  217.     FSrcBmp.Canvas.lock;
  218.     FSrcBmp.Width := Width;
  219.     FSrcBmp.Height := Height;
  220.     FSrcBmp.PixelFormat := pf24bit;

  221.     FDstBmp.Width := Width;
  222.     FDstBmp.Height := Height;
  223.     FDstBmp.PixelFormat := pf24bit;

  224.     FWater.SetSize(Width, Height);

  225.     if Picture.Graphic <> nil then
  226.     begin
  227.       FSrcBmp.Canvas.StretchDraw(ClientRect, Picture.Graphic);
  228.       FDstBmp.Assign(FSrcBmp);
  229.     end;
  230.     FDstBmp.Canvas.UnLock;
  231.     FSrcBmp.Canvas.Unlock;
  232.   end;   
  233. end;

  234. procedure TCnWaterImage.MouseMove(Shift: TShiftState; X, Y: Integer);
  235. begin
  236.   inherited;
  237.   if PtInRect(Rect(0, 0, Width, Height), Point(X, Y)) then
  238.   begin
  239.     if ssLeft in Shift then
  240.       Blob(X, Y, FRadius, FClickBlob)
  241.     else
  242.       Blob(X, Y, FRadius, FTrackBlob);
  243.   end;
  244. end;

  245. procedure TCnWaterImage.MouseDown(Button: TMouseButton; Shift: TShiftState;
  246.   X, Y: Integer);
  247. begin
  248.   inherited;
  249.   if Button = mbLeft then
  250.     Blob(X, Y, FRadius, FClickBlob);
  251. end;

  252. procedure TCnWaterImage.PictureChanged(Sender: TObject);
  253. begin
  254.   if AutoSize and (Picture.Width > 0) and (Picture.Height > 0) then
  255.     SetBounds(Left, Top, Picture.Width, Picture.Height);
  256.   UpdateWaterData;
  257.   if not FDrawing then Invalidate;
  258. end;

  259. procedure TCnWaterImage.OnTimer(Sender: TObject);
  260. var
  261.   Bmp: TBitmap;
  262. begin
  263.   if Enabled and (Picture.Graphic <> nil) then
  264.   begin
  265.     if (FRandomDelay > 0) and (FRandomBlob > 0) then
  266.     begin
  267.       if Random(Ceil(FRandomDelay / Integer(FTimer.Interval)) + 1) = 0 then
  268.         Blob(-1, -1, Random(2) + 1, Random(FRandomBlob) + 100);
  269.     end;
  270.    
  271.     if Assigned(FOnBeforeRender) then
  272.     begin
  273.       Bmp := TBitmap.Create;
  274.       try
  275.         Bmp.Assign(FSrcBmp);
  276.         FOnBeforeRender(Self, Bmp);
  277.         FWater.Render(Bmp, FDstBmp);
  278.       finally
  279.         Bmp.Free;
  280.       end;                     
  281.     end
  282.     else
  283.       FWater.Render(FSrcBmp, FDstBmp);

  284.     if Assigned(FOnAfterRender) then
  285.       FOnAfterRender(Self, FDstBmp);

  286.     Invalidate;
  287.   end;   
  288. end;

  289. procedure TCnWaterImage.Blob(x, y, ARadius, AHeight: Integer);
  290. begin
  291.   FWater.Blob(x, y, ARadius, AHeight);
  292. end;

  293. procedure TCnWaterImage.ClearWater;
  294. begin
  295.   FWater.ClearWater;
  296. end;

  297. function TCnWaterImage.GetCanvas: TCanvas;
  298. begin
  299.   Result := FDstBmp.Canvas;
  300. end;

  301. function TCnWaterImage.GetDamping: TWaterDamping;
  302. begin
  303.   Result := FWater.Damping;
  304. end;

  305. function TCnWaterImage.GetInterval: Cardinal;
  306. begin
  307.   Result := FTimer.Interval;
  308. end;

  309. procedure TCnWaterImage.SetDamping(const Value: TWaterDamping);
  310. begin
  311.   FWater.Damping := Value;
  312. end;

  313. procedure TCnWaterImage.SetInterval(Value: Cardinal);
  314. begin
  315.   FTimer.Interval := Value;
  316. end;

  317. procedure TCnWaterImage.SetPicture(Value: TPicture);
  318. begin
  319.   FPicture.Assign(Value);
  320. end;

  321. procedure TCnWaterImage.Loaded;
  322. begin
  323.   inherited;
  324.   UpdateWaterData;
  325. end;

  326. end.
复制代码


小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-12-17 22:24:25 | 显示全部楼层
水纹的大小,出现时间都可以设置的,自己去看看吧

http://www.cnpack.org/showdetail.php?id=739&lang=zh-cn
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-12-18 22:50:42 | 显示全部楼层

多谢你啦,你博客很棒,收藏啦!{:1_1:}
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-12-18 23:15:58 | 显示全部楼层
vxzv 发表于 2013-12-18 22:50
多谢你啦,你博客很棒,收藏啦!

谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-12-19 00:12:00 | 显示全部楼层
备受大家好评
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-12-19 10:04:23 | 显示全部楼层

客气啦!!!说实话那东西不是很会用。。。:sad
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-12-19 10:05:22 | 显示全部楼层
网络学习 发表于 2013-12-19 00:12
备受大家好评

神马??????????
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-12-19 11:52:16 | 显示全部楼层
vxzv 发表于 2013-12-19 10:04
客气啦!!!说实话那东西不是很会用。。。

那就直接用控件呗,delphi的控件很多,写程序省事
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-12-19 12:21:59 | 显示全部楼层
comeheres 发表于 2013-12-19 11:52
那就直接用控件呗,delphi的控件很多,写程序省事

那个空间就是在cnpack上下载的?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-12-19 13:13:25 | 显示全部楼层
vxzv 发表于 2013-12-19 12:21
那个空间就是在cnpack上下载的?

我不是给你下载地址了吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-12-20 12:02:42 | 显示全部楼层
comeheres 发表于 2013-12-19 13:13
我不是给你下载地址了吗

下了,多谢!!!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-8 03:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表