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

在显示或者隐藏窗口的时候,可以利用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);
}

窗口淡入

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

窗口淡出

private void button5_Click(object sender, EventArgs e)
{
 animateForm = new Form2();
 animateForm.Show();
 WindowsEffects.AnimateWindow(animateForm.Handle, 3000, WindowsEffects.AW_HIDE ^ WindowsEffects.AW_BLEND);
 animateForm.Close();
}

关于函数的一些介绍

AnimateWindow函数User32.dll中,最低支持到 Windows 2000
参考:https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-animatewindow

BOOL AnimateWindow(
 HWND hWnd, // 用于动画的窗口的句柄。调用线程必须拥有此窗口。
 DWORD dwTime, // 播放动画所花费的时间,以毫秒为单位。通常,一个动画的播放时间为200毫秒。
 DWORD dwFlags // 动画的类型。此参数可以是以下值中的一个或多个。注意,默认情况下,这些标志在显示窗口时生效。要在隐藏窗口时生效,请使用AW_HIDE和带有适当标志的逻辑或操作符。
);

dwFlags参数值列表

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

如果AnimateWindow方法调用成功则返回非0值,如果调用失败则返回0,即false。在下面的情况中可能会调用失败:

  • 如果窗口已经可见,而您试图显示该窗口。
  • 如果窗口已经隐藏,而您试图隐藏窗口。
  • 如果没有为幻灯片或滚动动画指定方向。
  • 当尝试用AW_BLEND动画子窗口时。
  • 如果线程不拥有窗口。注意,在本例中,AnimateWindow失败,但GetLastError返回ERROR_SUCCESS。通过GetLastError方法可以获取更多关于错误的信息。

另还需注意以下问题:

  • 若要不使用特殊效果而显示或隐藏窗口,请使用ShowWindow。
  • 使用幻灯片或滚动动画时,必须指定方向。它可以是AW_HOR_POSITIVE、AW_HOR_NEGATIVE、AW_VER_POSITIVE或AW_VER_NEGATIVE。
  • 可以将AW_HOR_POSITIVE或AW_HOR_NEGATIVE与AW_VER_POSITIVE或AW_VER_NEGATIVE组合在一起以对角方式动画窗口。
  • 窗口及其子窗口的窗口过程应该处理任何WM_PRINT或WM_PRINTCLIENT消息。对话框、控件和通用控件已经可以处理WM_PRINTCLIENT。默认的窗口过程已经处理WM_PRINT。
  • 如果一个子窗口显示部分剪切,当它是动画时,它将有洞被剪切。
  • AnimateWindow支持RTL窗口。

以上就是如何用WindowsForm给窗口添加一些简单的动画效果的详细内容,更多关于WindowsForm添加动画效果的资料请关注我们其它相关文章!

(0)

相关推荐

  • 如何让WindowsForm缩小到系统匣过程详解

    如何让windowsForm能像MSN一样缩小后会跑到右下方的系统匣内, 只要利用NotifyIcon就可以做到相同的功能,MSDN NotifyIcon组件说明 首先先开启一个windowsForm项目,在工具栏将NotifyIcon拉到windowsForm上. 接着先为NotifyIcon指定Icon和Text,就是在系统匣会出现的小图和鼠标移过去时出现的文字. 执行结果 如果要在窗口缩小时,只显示在系统匣显示, 反之则变成只显示在工作列,就必须要在Form的SizeChanged事件做控

  • 3种方法实现WindowsForm切换窗口

    在Windows Form平台下实现窗口跳转,常见的有以下几种方式,比如通过Show/ShowDialog方法显示新的窗口,通过多文档界面(MDI)在父窗口中加载子窗口,或者是通关过在窗口中动态加载自定义控件,比如通过将窗口中的Panel控件作为容器,将一些自定义元素作为视图界面控件,动态加载到Panel控件中.下面我们将简单介绍这几种方式 Show/ShowDialog 通过这两种方法可以很简单的实现窗口跳转, Home home = new Home(); home.Show(); Home

  • WindowsForm实现警告消息框的实例代码

    警告消息框主要是用来向用户户展示诸如警告.异常.完成和提示消息.一般实现的效果就是从系统窗口右下角弹出,然后加上些简单的显示和消失的动画. 创建警告框窗口 首先我们创建一个警告框窗口(Form),将窗口设置为无边框(FormBoderStyle=None),添加上图片和内容显示控件 创建好警告框后,我们先让他能够从窗口右下角显示出来, public partial class AlertMessageForm : Form { public AlertMessageForm() { Initia

  • WindowsForm移动一个没有标题栏的窗口的方法

    在WinForm程序中,要移动没有标题栏的窗口,基本的实现思路是监听需要拖动窗口内的控件的鼠标事件,然后将鼠标位置发送给窗口进行相应的位移就可以了.通过借用Windows API也可以很容易实现这一点,比如像下面这样. public class Win32Api { public const int WM_SYSCOMMAND = 0x112; public const int SC_DRAGMOVE = 0xF012; [DllImport("user32.Dll", EntryPo

  • C# WindowsForm程序同时启动多个窗口类

    C# WindowsForm程序同时启动多个窗口类,具体内容如下 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace MVCProject { /// <summary> /// 多窗口同时启动类 /// <remarks>继承A

  • WindowsForm实现TextBox占位符Placeholder提示功能

    在WinForm程序中,实现TextBox文本输入框占位符的方式也很多,最常用的是方式基于Windows Api SendMessage函数发送EM_SETCUEBANNER消息,或者通过TextBox自带的焦点事件处理. SendMessage函数实现 创建一个继承TextBox的ZhmTextBox输入框控件,新增Placeholder属性,在Placeholder的set方法中发送EM_SETCUEBANNER消息 public class ZhmTextBox: TextBox { pr

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

    在显示或者隐藏窗口的时候,可以利用Windows API中的AnimateWindow函数实现一些特殊的效果.主要的动画类型有四种:滚动.幻灯片.折叠或展开和alpha混合渐变. 窗口动画效果 首先定义动画工具类,引入AnimateWindow函数. public class WindowsEffects { public const int AW_ACTIVATE = 0x00020000; // 激活窗口.不要在AW_HIDE中使用此值. public const int AW_BLEND

  • js定时器+简单的动画效果实例

    1.向下滑动 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>向下滑动</title> <style> body { margin: 0px; } #show { width: 200px; /* 高度为 0 */ height: 100px; background-color: lightc

  • Android把商品添加到购物车的动画效果(贝塞尔曲线)

    当我们写商城类的项目的时候,一般都会有加入购物车的功能,加入购物车的时候会有一些抛物线动画,具体代码如下: 实现效果如图: 思路: 确定动画的起终点 在起终点之间使用二次贝塞尔曲线填充起终点之间的点的轨迹 设置属性动画,ValueAnimator插值器,获取中间点的坐标 将执行动画的控件的x.y坐标设为上面得到的中间点坐标 开启属性动画 当动画结束时的操作 难点: PathMeasure的使用 - getLength() - boolean getPosTan(float distance, f

  • jQuery实现简单滚动动画效果

    动画的思路很简单,点击页面上一个元素,页面滚动到指定位置.下面介绍一下我3个小时百度的研究成果: 首先是html部分: <html> <body> <a>顶部</a> <a>中部</a> ...<p>持续添加直到出现滚动条</p>... </body> </html> 先添加两个<a>元素作为按钮.然后对<a>元素进行补充: <html> <bo

  • Android实现添加商品到购物车动画效果

    本文实例为大家分享了Android添加商品到购物车的具体代码,供大家参考,具体内容如下 实现需求 在商品列表页面中,从列表item添加商品时,实现一个动画,给人感觉像是在添加商品到购物车. 思路 1.获取各个动画执行对象的起点和终点的坐标,利用PathMeasure绘制绘制贝塞尔曲线: 2.为商品图片设置属性动画: 3.为动画设置addUpdateListene监听器,更新view的坐标. 效果图: MainActivity.java package com.zlw.yzm.demo; impo

  • Jquery实现简单的动画效果代码

    复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title></title

  • Java 给PPT添加动画效果的示例

    PPT幻灯片中对形状可设置动画效果,常见的动画效果为内置的固定类型,即动画效果和路径是预先设定好的固定模板,但在设计动画效果时,用户也可以按照自己的喜好自定义动画动作路径.下面,通过Java后端程序代码来展示如何给PPT添加动画效果.包括预设动画以及自定动画效果的方法. 本次测试环境包括: 目标测试文档:Power Point 2013 编译环境:IntelliJ IDEA 2018 JDK版本:1.8.0 PPT库版本:spire.presentation.jar 4.3.2 注:在通过该PP

  • C# wpf 无边框窗口添加阴影效果的实现

    目录 前言 一.如何实现? 1.去除边框 2.添加阴影 3.添加触发器 二.示例代码 三.效果预览 总结 前言 制作无边框窗口时,系统自带阴影会消失,这时就需要我自己给窗口添加阴影以防止窗口融入背景.添加阴影的方法很简单,直接用effect就可以了,但这里还是有个不容易注意到的细节需要处理,加阴影后窗口最大化可能会有问题. 一.如何实现? 1.去除边框 (1)方法一 使用WindowStyle可以去除窗口边框,AllowsTransparency+Background制造透明窗口为阴影留出透明边

  • javascript 动态脚本添加的简单方法

    异步加载js文件或者异步加载js模块,支持所有浏览器,包括IE,参考至javascript高级编程 1.createScript方法用于创建一个script标签并添加到body标签中 2.createModule方法用于创建一个script脚本的标签,并且如果在IE8以下的版本运行会抛出异常,在异常捕获模块中执行script.text兼容IE添加js的脚本内容. <button id="demo">js文件</button> <button id=&quo

随机推荐