TrayAnimation.pas
上传用户:hylc_2004
上传日期:2014-01-23
资源大小:46800k
文件大小:8k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. unit TrayAnimation;
  2. { D5 and down don't support alpha-blending (transparent forms). }
  3. {$IFDEF VER140} {$DEFINE DELPHI_6} {$ENDIF}
  4. {$IFDEF VER150} {$DEFINE DELPHI_7} {$ENDIF}
  5. {$IFDEF DELPHI_6} {$DEFINE DELPHI_6_UP} {$ENDIF}
  6. {$IFDEF DELPHI_7} {$DEFINE DELPHI_6_UP} {$ENDIF}
  7. interface
  8. uses
  9.   Windows, Classes, Graphics, Forms;
  10. type
  11.   TWindowFader = class(TThread)
  12.   private
  13.     BlendValue: Integer;
  14.     procedure Fade;
  15.   public
  16.     FadeOut: Boolean;
  17.     procedure Execute; override;
  18.   end;
  19.   TWindowImploder = class(TThread)
  20.   private
  21.     X, Y, W, H: Integer;
  22.     procedure Implode;
  23.   public
  24.     Imploding: Boolean;
  25.     procedure Execute; override;
  26.   end;
  27.   TWindowOutlineImploder = class(TThread)
  28.   private
  29.     X, Y, W, H: Integer;
  30.     DesktopCanvas: TCanvas;
  31.     procedure Implode;
  32.   public
  33.     Imploding: Boolean;
  34.     constructor Create;
  35.     destructor Destroy; override;
  36.     procedure Execute; override;
  37.   end;
  38.   procedure FloatingRectangles(Minimizing, OverrideUserSettings: Boolean);
  39. implementation
  40. uses
  41.   Math, ShellApi, Messages, Main;
  42. {----------------- Stand-alone methods ----------------}
  43. procedure FloatingRectangles(Minimizing, OverrideUserSettings: Boolean);
  44. var
  45.   RectFrom, RectTo: TRect;
  46.   GotRectTo: Boolean;
  47.   abd: TAppBarData;
  48.   HTaskbar, HTrayWnd: HWND;
  49.   ResetRegistry: Boolean;
  50.   ai: TAnimationInfo;
  51.   procedure SetAnimation(Animation: Boolean);
  52.   begin
  53.     FillChar(ai, SizeOf(ai), 0);
  54.     ai.cbSize := SizeOf(ai);
  55.     if Animation then
  56.       ai.iMinAnimate := 1
  57.     else
  58.       ai.iMinAnimate := 0;
  59.     SystemParametersInfo(SPI_SETANIMATION, 0, @ai, SPIF_SENDCHANGE);
  60.   end;
  61. begin
  62.   // Check if user wants window animation
  63.   ResetRegistry := False;
  64.   if OverrideUserSettings then
  65.   begin
  66.     FillChar(ai, SizeOf(ai), 0);
  67.     ai.cbSize := SizeOf(ai);
  68.     SystemParametersInfo(SPI_GETANIMATION, 0, @ai, SPIF_SENDCHANGE);
  69.     if ai.iMinAnimate = 0 then
  70.     begin
  71.       // Temporarily enable window animation
  72.       ResetRegistry := True;
  73.       SetAnimation(True);
  74.     end;
  75.   end;
  76.   RectFrom := MainForm.BoundsRect;
  77.   GotRectTo := False;
  78.   // Get the traybar's bounding rectangle
  79.   HTaskbar := FindWindow('Shell_TrayWnd', nil);
  80.   if HTaskbar <> 0 then
  81.   begin
  82.     HTrayWnd := FindWindowEx(HTaskbar, 0, 'TrayNotifyWnd', nil);
  83.     if HTrayWnd <> 0 then
  84.       if GetWindowRect(HTrayWnd, RectTo) then
  85.         GotRectTo := True;
  86.   end;
  87.   // If that fails, invent a rectangle in the corner where the traybar is
  88.   if not GotRectTo then
  89.   begin
  90.     FillChar(abd, SizeOf(abd), 0);
  91.     abd.cbSize := SizeOf(abd);
  92.     if SHAppBarMessage(ABM_GETTASKBARPOS, abd) = 0 then Exit;
  93.     with Screen, abd.rc do
  94.       if (Top > 0) or (Left > 0) then
  95.         RectTo := Rect(Width-32, Height-32, Width, Height)
  96.       else if (Bottom < Height) then
  97.         RectTo := Rect(Width-32, 0, Width, 32)
  98.       else if (Right < Width) then
  99.         RectTo := Rect(0, Height-32, 32, Height);
  100.   end;
  101.   if Minimizing then
  102.     DrawAnimatedRects(MainForm.Handle, IDANI_CAPTION, RectFrom, RectTo)
  103.   else
  104.     DrawAnimatedRects(MainForm.Handle, IDANI_CAPTION, RectTo, RectFrom);
  105.   if ResetRegistry then
  106.     SetAnimation(False);               // Disable window animation
  107. end;
  108. {-------------------- TWindowFader --------------------}
  109. procedure TWindowFader.Execute;
  110. begin
  111. {$IFDEF DELPHI_6_UP}
  112.   BlendValue := MainForm.AlphaBlendValue;
  113. {$ENDIF}
  114.   while not Terminated do
  115.   begin
  116.     if FadeOut then
  117.       Dec(BlendValue, 25)
  118.     else
  119.       Inc(BlendValue, 25);
  120.     Sleep(10);
  121. //    Application.ProcessMessages;
  122.     Synchronize(Fade);
  123.     if (BlendValue <= 0) or (BlendValue >= 255) then
  124.       Terminate;
  125.   end;
  126. end;
  127. procedure TWindowFader.Fade;
  128. begin
  129. {$IFDEF DELPHI_6_UP}
  130.   if (BlendValue >= 0) and (BlendValue <= 255) then
  131.     MainForm.AlphaBlendValue := BlendValue;
  132. {$ENDIF}
  133. end;
  134. {------------------ TWindowImploder -------------------}
  135. procedure TWindowImploder.Execute;
  136. const
  137.   minW = 120;
  138.   minH = 25;
  139.   deltaGrowth = 0.2;
  140. var
  141.   maxW, maxH: Integer;
  142.   deltaW, deltaH: Integer;
  143. begin
  144.   with MainForm do
  145.   begin
  146.     X := Left;
  147.     Y := Top;
  148.     W := Width;
  149.     H := Height;
  150.     if Imploding then
  151.     begin
  152.       // Store current form size
  153.       StartX := Left;
  154.       StartY := Top;
  155.       StartW := Width;
  156.       StartH := Height;
  157.     end;
  158.     // Remember previous form size
  159.     maxW := StartW;
  160.     maxH := StartH;
  161.   end;
  162.   while not Terminated do
  163.   begin
  164.     deltaW := Round((W-minW) * deltaGrowth);
  165.     deltaH := Round((H-minH) * deltaGrowth);
  166.     if deltaW = 0 then
  167.       Inc(deltaW);
  168.     if Odd(deltaW) then
  169.       Inc(deltaW);
  170.     if deltaH = 0 then
  171.       Inc(deltaH);
  172.     if Odd(deltaH) then
  173.       Inc(deltaH);
  174.     if Imploding then
  175.     begin
  176.       W := W - deltaW;
  177.       H := H - deltaH;
  178.       X := X + (deltaW div 2);
  179.       Y := Y + (deltaH div 2);
  180.     end
  181.     else
  182.     begin
  183.       W := W + deltaW;
  184.       H := H + deltaH;
  185.       X := X - (deltaW div 2);
  186.       Y := Y - (deltaH div 2);
  187.     end;
  188.     Sleep(10);
  189.     if (Imploding and ((W <= minW) or (H <= minH) or (deltaW = 0))) or
  190.        (not Imploding and ((W >= maxW) or (H >= maxH) or (deltaH = 0))) then
  191.       Terminate;
  192.     if not Terminated then
  193.       Synchronize(Implode);
  194.     Application.ProcessMessages;
  195.   end;
  196.   if not Imploding then
  197.   begin
  198.     with MainForm do
  199.       SetWindowPos(Handle, 0, StartX, StartY, StartW, StartH, SWP_NOZORDER);
  200.     Application.ProcessMessages;
  201.   end;
  202. end;
  203. procedure TWindowImploder.Implode;
  204. begin
  205.   SetWindowPos(MainForm.Handle, 0, X, Y, W, H, SWP_NOZORDER);
  206. end;
  207. {--------------- TWindowOutlineImploder ---------------}
  208. constructor TWindowOutlineImploder.Create;
  209. begin
  210.   inherited Create(False);
  211.   DesktopCanvas := TCanvas.Create;
  212.   with DesktopCanvas do
  213.   begin
  214.     Handle := GetDC(0);      // HDC of desktop
  215. //    Handle := GetWindowDC(GetDesktopWindow);
  216.     Pen.Mode := pmNotXor;
  217.     Pen.Style := psDot;
  218.     Pen.Width := 2;
  219.     Pen.Color := clGray;
  220. //    Brush.Color := clGray;
  221. //    Brush.Style := bsDiagCross;
  222.     Brush.Style := bsClear;
  223.   end;
  224. end;
  225. destructor TWindowOutlineImploder.Destroy;
  226. begin
  227. //  ReleaseDC(GetDesktopWindow, DesktopCanvas.Handle);
  228.   ReleaseDC(0, DesktopCanvas.Handle);
  229.   DesktopCanvas.Handle := 0;
  230.   DesktopCanvas.Free;
  231.   DesktopCanvas := nil;
  232.   inherited Destroy;
  233. end;
  234. procedure TWindowOutlineImploder.Execute;
  235. const
  236.   minW = 25;
  237.   minH = 25;
  238.   deltaGrowth = 0.25;
  239. var
  240.   maxW, maxH: Integer;
  241.   deltaW, deltaH: Integer;
  242. begin
  243.   with MainForm do
  244.   begin
  245.     if Imploding then
  246.     begin
  247.       X := Left;
  248.       Y := Top;
  249.       W := Width;
  250.       H := Height;
  251.       // Store current form size
  252.       StartX := Left;
  253.       StartY := Top;
  254.       StartW := Width;
  255.       StartH := Height;
  256.       CoolTrayIcon1.HideMainForm;
  257.     end
  258.     else
  259.     begin
  260.       X := StartX + ((StartW-minW) div 2);
  261.       Y := StartY + ((StartH-minH) div 2);
  262.       W := minW;
  263.       H := minH;
  264.     end;
  265.     // Remember previous form size
  266.     maxW := StartW;
  267.     maxH := StartH;
  268.   end;
  269.   while not Terminated do
  270.   begin
  271.     deltaW := Round((W-minW) * deltaGrowth);
  272.     deltaH := Round((H-minH) * deltaGrowth);
  273.     if deltaW = 0 then
  274.       Inc(deltaW);
  275.     if Odd(deltaW) then
  276.       Inc(deltaW);
  277.     if deltaH = 0 then
  278.       Inc(deltaH);
  279.     if Odd(deltaH) then
  280.       Inc(deltaH);
  281.     if Imploding then
  282.     begin
  283.       W := W - deltaW;
  284.       H := H - deltaH;
  285.       X := X + (deltaW div 2);
  286.       Y := Y + (deltaH div 2);
  287.     end
  288.     else
  289.     begin
  290.       W := W + deltaW;
  291.       H := H + deltaH;
  292.       X := X - (deltaW div 2);
  293.       Y := Y - (deltaH div 2);
  294.     end;
  295.     Synchronize(Implode);
  296.     if (Imploding and ((W <= minW) or (H <= minH) or (deltaW = 0))) or
  297.        (not Imploding and ((W >= maxW) or (H >= maxH) or (deltaH = 0))) then
  298.       Terminate;
  299.   end;
  300. end;
  301. procedure TWindowOutlineImploder.Implode;
  302. {var
  303.   R: TRect;}
  304. begin
  305.   if not Terminated then
  306.     if (DesktopCanvas <> nil) and (DesktopCanvas.Handle <> 0) then
  307.     begin
  308. //      R := Rect(X, Y, X+W, Y+H);
  309. //      InvalidateRect(DesktopCanvas.Handle, @R, True);
  310. //      PostMessage(DesktopCanvas.Handle, WM_SETREDRAW, 1, 0);
  311. //      RedrawWindow(DesktopCanvas.Handle, 0, 0, RDW_ERASE or RDW_INVALIDATE or RDW_ERASENOW);
  312. //      UpdateWindow(DesktopCanvas.Handle);
  313.       DesktopCanvas.Rectangle(X, Y, X+W, Y+H);
  314.       Sleep(10);
  315.       DesktopCanvas.Rectangle(X, Y, X+W, Y+H);
  316.     end;
  317. end;
  318. end.