DrawAnimatedRects (user32)
Last changed: -87.0.250.181

.
Summary

C# Signature:

[DllImport("user32.dll")]
static extern bool DrawAnimatedRects(IntPtr hwnd, int idAni,
   [In] ref RECT lprcFrom, [In] ref RECT lprcTo);

User-Defined Types:

IDANI_

Notes:

Only the IDANI_CAPTION constant will result in any animation. Any other constants have not been implemented on any Windows platform!

Tips & Tricks:

Since only IDANI_CAPTION is implemented, to get the effect of IDANI_OPEN, simply swap the lprcFrom and lprcTo rectangles, but still specify the IDANI_CAPTION constant.

Sample Code:

    /// <summary>
    /// This constant is not implemented on any Windows platform!
    /// </summary>
    public const System.Int32 IDANI_OPEN = 1;

    /// <summary>
    /// The window caption will animate from lprcFrom to lprcTo.
    /// </summary>
    public const System.Int32 IDANI_CAPTION = 3;

    [System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential)]
    struct RECT
    {
      public RECT(System.Drawing.Rectangle rectangle)
      {
        Left = rectangle.Left;
        Top = rectangle.Top;
        Right = rectangle.Right;
        Bottom = rectangle.Bottom;
      }
      public RECT(System.Drawing.Point location, System.Drawing.Size size)
      {
        Left = location.X;
        Top = location.Y;
        Right = location.X + size.Width;
        Bottom = location.Y + size.Height;
      }
      public System.Int32 Left;
      public System.Int32 Top;
      public System.Int32 Right;
      public System.Int32 Bottom;
    }

    [System.Runtime.InteropServices.DllImport("user32.dll")]
    static extern bool DrawAnimatedRects(System.IntPtr hwnd, int idAni,
      [System.Runtime.InteropServices.In] ref RECT lprcFrom,
      [System.Runtime.InteropServices.In] ref RECT lprcTo);

    [System.Runtime.InteropServices.DllImport("user32.dll", SetLastError = true)]
    static extern System.IntPtr FindWindow(string lpClassName, string lpWindowName);

    [System.Runtime.InteropServices.DllImport("user32.dll", SetLastError = true)]
    static extern System.IntPtr FindWindowEx(System.IntPtr hwndParent, System.IntPtr hwndChildAfter,
      string lpszClass, string lpszWindow);

    [System.Runtime.InteropServices.DllImport("user32.dll")]
    static extern bool GetWindowRect(System.IntPtr hWnd, out RECT lpRect);

    /// <summary>
    /// Show or hide a form with animation.
    /// </summary>
    /// <param name="form">The form reference to be animated.</param>
    /// <param name="show">If true the form will be animated as if opening, otherwise as if closing.</param>
    static public void ShowHideAnimated(System.Windows.Forms.Form form, System.Boolean show)
    {
      RECT from = new RECT(form.Location, form.Size);
      RECT to;

      System.IntPtr hWnd =
        FindWindowEx(FindWindow("Shell_TrayWnd", null), System.IntPtr.Zero, "TrayNotifyWnd", null);

      if (hWnd != System.IntPtr.Zero)
      {
        GetWindowRect(hWnd, out to);
      }
      else
      {
        to.Left = System.Windows.Forms.SystemInformation.VirtualScreen.Right - form.Width;
        to.Top = System.Windows.Forms.SystemInformation.VirtualScreen.Bottom -
          System.Windows.Forms.SystemInformation.CaptionHeight -
            (System.Windows.Forms.SystemInformation.FrameBorderSize.Height * 2);
        to.Right = System.Windows.Forms.SystemInformation.VirtualScreen.Right;
        to.Bottom = System.Windows.Forms.SystemInformation.VirtualScreen.Bottom;
      }

      if (show)
      {
        DrawAnimatedRects(form.Handle, IDANI_CAPTION, ref to, ref from);
        form.Show();
      }
      else
      {
        form.Hide();
        DrawAnimatedRects(form.Handle, IDANI_CAPTION, ref from, ref to);
      }
    }

Alternative Managed API:

    [StructLayout(System::Runtime::InteropServices::LayoutKind::Sequential)]
    ref struct RECT {
    public:
    RECT() {
    }

    RECT(System::Drawing::Rectangle rectangle) {
        Left = rectangle.Left;
        Top = rectangle.Top;
        Right = rectangle.Right;
        Bottom = rectangle.Bottom;
    }

    RECT(System::Drawing::Point location, System::Drawing::Size size) {
        Left = location.X;
        Top = location.Y;
        Right = location.X + size.Width;
        Bottom = location.Y + size.Height;
    }

    System::Int32 Left;
    System::Int32 Top;
    System::Int32 Right;
    System::Int32 Bottom;
    };

    [DllImport("user32.dll")]
    bool DrawAnimatedRects(int hwnd, int idAni, RECT^ lprcFrom, RECT^ lprcTo);

    [DllImport("user32.dll", SetLastError = true)]
    int FindWindow(String^ lpClassName, String^ lpWindowName);

    [DllImport("user32.dll", SetLastError = true)]
    int FindWindowEx(int hwndParent, int hwndChildAfter,
      String^ lpszClass, String^ lpszWindow);

    [DllImport("user32.dll")]
    bool GetWindowRect(int hWnd, RECT^ lpRect);

    static const int IDANI_OPEN = 1;
    static const int IDANI_CAPTION = 3;

    void ShowHideAnimated(bool show) {
    RECT^ from=gcnew RECT(this->Location, this->Size);
    RECT^ to=gcnew RECT();

    int hWnd=FindWindowEx(FindWindow("Shell_TrayWnd", nullptr), 0, "TrayNotifyWnd", nullptr);

    if (hWnd != 0) {
        GetWindowRect(hWnd, to);
    }
    else {
          to->Left = System::Windows::Forms::SystemInformation::VirtualScreen.Rig ht - 32;
          to->Top = System::Windows::Forms::SystemInformation::VirtualScreen.Bot tom -32;
          to->Right = System::Windows::Forms::SystemInformation::VirtualScreen.Rig ht;
          to->Bottom = System::Windows::Forms::SystemInformation::VirtualScreen.Bot tom;
    }

    if (show) {
        DrawAnimatedRects(this->Handle.ToInt32(), IDANI_CAPTION, to, from);
        this->Show();
    }
    else {
        this->Hide();
        DrawAnimatedRects(this->Handle.ToInt32(), IDANI_CAPTION, from, to);
    }
    }

Comment from admin@paradisim.net : When you post your examples, let people know if/who wrote the example that way Myself & Others can give credit to you if it gets re-used in our own code!

Documentation