如何用WindowsForm给窗口添加一些简单的动画效果

2020-07-02 11:01:30刘景俊

在显示或者隐藏窗口的时候,可以利用Windows API中的AnimateWindow函数实现一些特殊的效果。主要的动画类型有四种:滚动、幻灯片、折叠或展开和alpha混合渐变。

窗口动画效果

首先定义动画工具类,引入AnimateWindow函数。

  public class WindowsEffects
  {
    public const int AW_ACTIVATE = 0x00020000; // 激活窗口。不要在AW_HIDE中使用此值。
    public const int AW_BLEND = 0x00080000; // 使用淡入效果。此标志只能在hwnd是顶级窗口时使用。
    public const int AW_CENTER = 0x00000010; // 如果使用了AW_HIDE,则使窗口看起来向内折叠;如果没有使用AW_HIDE,则使窗口向外展开。不同的方向标志没有效果。
    public const int AW_HIDE = 0x00010000; //	隐藏窗口。默认情况下,窗口会显示出来。
    public const int AW_HOR_POSITIVE = 0x00000001;//	使窗口从左到右产生动画效果。此标志可用于滚动或幻灯片动画。当与AW_CENTER或AW_BLEND一起使用时,它会被忽略。
    public const int AW_HOR_NEGATIVE = 0x00000002;//	从右到左使窗口具有动画效果。此标志可用于滚动或幻灯片动画。当与AW_CENTER或AW_BLEND一起使用时,它会被忽略。
    public const int AW_SLIDE = 0x00040000;//	使用幻灯片动画。默认情况下,使用滚动动画。当与AW_CENTER一起使用时,这个标志将被忽略。
    public const int AW_VER_POSITIVE = 0x00000004; //	从上到下动画窗口。此标志可用于滚动或幻灯片动画。当与AW_CENTER或AW_BLEND一起使用时,它会被忽略。
    public const int AW_VER_NEGATIVE = 0x00000008; //	从下到上使窗口具有动画效果。此标志可用于滚动或幻灯片动画。当与AW_CENTER或AW_BLEND一起使用时,它会被忽略。

    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    public static extern int AnimateWindow(IntPtr hwand, int dwTime, int dwFlag);
  }

窗口从左到右展开

Form2 animateForm;

private void button1_Click(object sender, EventArgs e)
{
  animateForm = new Form2();
  WindowsEffects.AnimateWindow(animateForm.Handle, 3000, WindowsEffects.AW_HOR_POSITIVE);
}

从左上角到右下角展开窗口

private void button2_Click(object sender, EventArgs e)
{
  animateForm = new Form2();
  WindowsEffects.AnimateWindow(animateForm.Handle, 3000, WindowsEffects.AW_HOR_POSITIVE ^ WindowsEffects.AW_VER_POSITIVE);
}

从中心展开窗口

private void button3_Click(object sender, EventArgs e)
{
  animateForm = new Form2();
  WindowsEffects.AnimateWindow(animateForm.Handle, 3000, WindowsEffects.AW_CENTER);
}