65.9K
CodeProject is changing. Read more.
Home

C# Fade Form Effect With the AnimateWindow API Function

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.78/5 (33 votes)

Oct 19, 2008

CPOL

1 min read

viewsIcon

105923

downloadIcon

4142

An easy way to perform fade/slide effects for forms.

The Motivation

I required a fade/slide effect to replace a previous thread based approach that was using deprecated methods.

When consulting the oracle (Google), I was able to find more than a few articles that use opacity or utility type implementation of the AnimateWindow function, but I was looking for a solution to hide the functionality and keep things as simple as possible, so I created FadeForm.

The Objective

Write a class that implements/wraps the AnimateWindow function which can easily be added to existing code.

The Code

The FadePage Object

Create a new class that derives from System.Windows.Forms.Form which will allow us to extend the behavior of a standard form with the AnimateWindow method.

public abstract class FadeForm : Form
{}

Next, create a member variable that will determine if we fade or slide, and a few constructors to assign the variable, with the default being the slide effect.

public abstract class FadeForm : Form
{
    private bool _UseSlideAnimation;
    public FadeForm() : this(false) { }
    public FadeForm(bool useSlideAnimation)
    {
        _UseSlideAnimation = useSlideAnimation;
    }
}

The AnimateWindow Implementation

This is really the guts of the class that will control the effects. The logic is based on a previous article, and modified to hide the actual implementation.

Declare the integers that define the effects and the functions internally to the fade page class.

const int AW_HIDE = 0X10000;
const int AW_ACTIVATE = 0X20000;
const int AW_HOR_POSITIVE = 0X1;
const int AW_HOR_NEGATIVE = 0X2;
const int AW_SLIDE = 0X40000;
const int AW_BLEND = 0X80000;
[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern int AnimateWindow
(IntPtr hwand, int dwTime, int dwFlags);

Finally, we override the load and close methods of the Form class to perform the automation.

protected override void OnLoad(EventArgs e)
{
    base.OnLoad(e);
    AnimateWindow(this.Handle, 1000, AW_ACTIVATE | (_UseSlideAnimation ? 
                  AW_HOR_POSITIVE | AW_SLIDE : AW_BLEND));
}
protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
{
    base.OnClosing(e);
    if (e.Cancel == false)
    {
        AnimateWindow(this.Handle, 1000, AW_HIDE | (_UseSlideAnimation ? 
                      AW_HOR_NEGATIVE | AW_SLIDE : AW_BLEND));
    }
}

Using the Class

Consuming the class is very simple, and requires a single line of code change to existing forms, by choosing to derive from FadeForm instead of the standard Form.

public partial class TestForm : Form
{
}

Changes to…

public partial class TestForm : FadeForm
{
}

Or

public partial class TestForm : FadeForm
{
    public TestForm() : base(true|false) {}

}