第一种方法,在屏幕下方缓缓出来,又缓缓关闭,这类效果自然使用原生态的API最合适不过了
核心代码:
/// <summary>
/// 窗体动画函数
/// </summary>
/// <param name="hwnd">指定产生动画的窗口的句柄</param>
/// <param name="dwTime">指定动画持续的时间</param>
/// <param name="dwFlags">指定动画类型,可以是一个或多个标志的组合。</param>
/// <returns></returns>
[DllImport("user32")]
private static extern bool AnimateWindow(IntPtr hwnd, int dwTime, int dwFlags);
//下面是可用的常量,根据不同的动画效果声明自己需要的
private const int AW_HOR_POSITIVE = 0x0001;//自左向右显示窗口,该标志可以在滚动动画和滑动动画中使用。使用AW_CENTER标志时忽略该标志
private const int AW_HOR_NEGATIVE = 0x0002;//自右向左显示窗口,该标志可以在滚动动画和滑动动画中使用。使用AW_CENTER标志时忽略该标志
private const int AW_VER_POSITIVE = 0x0004;//自顶向下显示窗口,该标志可以在滚动动画和滑动动画中使用。使用AW_CENTER标志时忽略该标志
private const int AW_VER_NEGATIVE = 0x0008;//自下向上显示窗口,该标志可以在滚动动画和滑动动画中使用。使用AW_CENTER标志时忽略该标志该标志
private const int AW_CENTER = 0x0010;//若使用了AW_HIDE标志,则使窗口向内重叠;否则向外扩展
private const int AW_HIDE = 0x10000;//隐藏窗口
private const int AW_ACTIVE = 0x20000;//激活窗口,在使用了AW_HIDE标志后不要使用这个标志
private const int AW_SLIDE = 0x40000;//使用滑动类型动画效果,默认为滚动动画类型,当使用AW_CENTER标志时,这个标志就被忽略
private const int AW_BLEND = 0x80000;//使用淡入淡出效果
调用代码(将窗体的FormBorderStyle属性设置为none):
/// <summary>
/// 窗体加载事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Form1_Load(object sender, EventArgs e)
{
//从屏幕右下角出来
int x = Screen.PrimaryScreen.WorkingArea.Right - this.Width;
int y = Screen.PrimaryScreen.WorkingArea.Bottom - this.Height;
//从屏幕下方任务栏开始上升到屏幕中央
//int x = Screen.PrimaryScreen.WorkingArea.Bottom - this.Height;
//int y = Screen.PrimaryScreen.WorkingArea.Bottom - this.Height;
//从屏幕下方开始上升到屏幕中上方
//int x = Screen.PrimaryScreen.WorkingArea.Bottom - this.Height;
// int y = Screen.PrimaryScreen.WorkingArea.Bottom - this.Width;
this.Location = new Point(x, y);//设置窗体在屏幕右下角显示
AnimateWindow(this.Handle, 1000, AW_SLIDE | AW_ACTIVE | AW_VER_NEGATIVE);
}
/// <summary>
/// 窗体关闭事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
AnimateWindow(this.Handle, 1000, AW_BLEND | AW_HIDE);
}
第二种方法,主窗体居中并且主窗体淡入淡出的特效
using System.Runtime.InteropServices;
public class Win32
{
public const Int32 AW_HOR_POSITIVE = 0x00000001; // 从左到右打开窗口
public const Int32 AW_HOR_NEGATIVE = 0x00000002; // 从右到左打开窗口
public const Int32 AW_VER_POSITIVE = 0x00000004; // 从上到下打开窗口
public const Int32 AW_VER_NEGATIVE = 0x00000008; // 从下到上打开窗口
public const Int32 AW_CENTER = 0x00000010; //若使用了AW_HIDE标志,则使窗口向内重叠;若未使用AW_HIDE标志,则使窗口向外扩展。
public const Int32 AW_HIDE = 0x00010000; //隐藏窗口,缺省则显示窗口。
public const Int32 AW_ACTIVATE = 0x00020000; //激活窗口。在使用了AW_HIDE标志后不要使用这个标志。
public const Int32 AW_SLIDE = 0x00040000; //使用滑动类型。缺省则为滚动动画类型。当使用AW_CENTER标志时,这个标志就被忽略。
public const Int32 AW_BLEND = 0x00080000; //使用淡出效果。只有当hWnd为顶层窗口的时候才可以使用此标志。
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern bool AnimateWindow(
IntPtr hwnd, // handle to window
int dwTime, // duration of animation
int dwFlags // animation type
);
}
/// <summary>
/// 窗体加载事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
/**//*淡入窗体*/
private void Form_Load(object sender, EventArgs e)
{
Win32.AnimateWindow(this.Handle, 2000, Win32.AW_BLEND);
}
/// <summary>
/// 窗体关闭事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
/**//*淡出窗体*/
private void Form_FormClosing(object sender, FormClosingEventArgs e)
{
Win32.AnimateWindow(this.Handle, 2000, Win32.AW_SLIDE | Win32.AW_HIDE | Win32.AW_BLEND);
}
出自:https://www.cnblogs.com/mq0036/p/6421946.html
第三种方法:启用主窗体,特效动画从中心点向四周展开显示窗体,关闭窗体特效动画从四周收缩回中心点关闭窗体
核心代码
//定义变量
bool flag = false;
//在窗体构造函数里面给变更赋初始值
public Form3()
{
InitializeComponent();
flag = true;
}
#region user32.dll
//导入user32.dll
[System.Runtime.InteropServices.DllImport("user32")]
//声明API函数
private static extern bool AnimateWindow(IntPtr hwnd, int dwTime, int dwFlags);
#endregion
#region 常量
//正面_水平方向
const int AW_HOR_POSITIVE = 0x0001;
//负面_水平方向
const int AW_HOR_NEGATIVE = 0x0002;
//正面_垂直方向
const int AW_VER_POSITIVE = 0x0004;
//负面_垂直方向
const int AW_VER_NEGATIVE = 0x0008;
//由中间四周展开或
const int AW_CENTER = 0x0010;
//隐藏对象
const int AW_HIDE = 0x10000;
//显示对象
const int AW_ACTIVATE = 0x20000;
//拉幕滑动效果
const int AW_SLIDE = 0x40000;
//淡入淡出渐变效果
const int AW_BLEND = 0x80000;
#endregion
#region 判断方向
public int IsHorOrVer(int pos)
{
int rtn = 0;
//判断是正方向还是反方向
if (pos.Equals(0))
{
//判断是横向还是纵向
if (flag)
rtn = AW_HOR_POSITIVE;
else rtn = AW_VER_POSITIVE;
}
else if (pos.Equals(1))
{
//判断是横向还是纵向
if (flag)
rtn = AW_HOR_NEGATIVE;
else rtn = AW_VER_NEGATIVE;
}
return rtn;
}
#endregion
/// <summary>
/// 窗体加载事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
/**//*淡入窗体*/
private void Form_Load(object sender, EventArgs e)
{
//动画——窗体由中心向四周扩展
AnimateWindow(this.Handle, 1000, AW_CENTER | AW_ACTIVATE | IsHorOrVer(0));
}
/// <summary>
/// 窗体关闭事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
/**//*淡出窗体*/
private void Form_FormClosing(object sender, FormClosingEventArgs e)
{
//动画——窗体由四周向中心缩小直至消失
AnimateWindow(this.Handle, 1000, AW_CENTER | AW_HIDE | IsHorOrVer(1));
}
特效代码,根据个人爱好使用,替换掉加载和关闭事件里面的即可:
//动画——窗体向上拖拉
AnimateWindow(this.Handle, 1000, AW_SLIDE | AW_HIDE | IsHorOrVer(1));
//动画——窗体向下拖拉
AnimateWindow(this.Handle, 1000, AW_SLIDE | AW_ACTIVATE | IsHorOrVer(0));
//动画——窗体淡出特效
AnimateWindow(this.Handle, 1000, AW_BLEND | AW_HIDE | IsHorOrVer(1));
//动画——窗体淡入特效
AnimateWindow(this.Handle, 1000, AW_BLEND | AW_ACTIVATE | IsHorOrVer(0));
//动画——窗体由四周向中心缩小直至消失
AnimateWindow(this.Handle, 1000, AW_CENTER | AW_HIDE | IsHorOrVer(1));
//动画——窗体由中心向四周扩展
AnimateWindow(this.Handle, 1000, AW_CENTER | AW_ACTIVATE | IsHorOrVer(0));