WinForm窗体程序 主窗体开启和关闭动画效果_winform 窗体特效_小丫头呀的博客-程序员宅基地

技术标签: winform  c#  .net  Winform窗体应用开发系列  

第一种方法,在屏幕下方缓缓出来,又缓缓关闭,这类效果自然使用原生态的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));

出自:https://www.jb51.net/article/71862.htm

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_39237340/article/details/113559648

智能推荐

游武大 登临珞珈——探武大旅游最佳路线-程序员宅基地

文章浏览阅读1.9k次。公司提议组织一次登山活动,这是本年度继登瑜家山以来的第二次登山活动。作为登山队长的我接手了这次活动的组织任务。吸取上次登山活动的经验,我着重画出了本次活动的具体行进路线。这次活动的目的是游赏、锻炼与人文熏陶,总体来说都基本达到了。虽然具体的行进过程中遇到一些计划外的状况,因为有备案所以都一一化解,并成为这一次以锻炼为主的登山活动的小插曲。下面重点谈谈这些小插曲。是笔直穿越武大还是爬珞珈主山

java trace 追踪_全链路日志追踪-trace_id方式-程序员宅基地

文章浏览阅读1.5k次。全链路日志追踪过程:nginx---> 网关--->服务A----服务.......1、nginx相关配置(1) nginx.conf# HTTPS serverserver {listen 443 ssl http2;server_name mp-sit.smartmidea.net;ssl_protocols TLSv1.1 TLSv1.2;ssl_certific..._log4j2 traceid spanid

jupyter notebook&& jupyter lab-程序员宅基地

文章浏览阅读200次。目录1.jupyter notebook2.jupyter lab1.jupyter notebookconda install jupyter notebookconda install nb_conda创建虚拟环境并进入,然后i继续:pip install ipykernel #预安装 ipykernel 包# 将tensorflow环境作为 kernel 初始化,并命名为. 这个环境添加到了ipython的kernel中python -m ipykernel.

python获取窗口句柄_python+selenium+new——窗口——获取句柄-程序员宅基地

文章浏览阅读528次。from selenium import webdriverdriver.current_window_handle #获取当前窗口句柄driver.window_handles # 用于获取所有窗口句柄--------------------------------------------------------------------------------...

【图像配准】基于互信息图像配准含Matlab源码_matlabgan网络图像配准开源项目_Matlab科研工作室的博客-程序员宅基地

文章浏览阅读597次。1 简介图像配准是图像处理技术的基础,是图像镶嵌,图像融合,目标追踪的重要前提.现在的图像规模越来越大,图像信息越来越复杂,自动配准成了配准的首要方法和重要研究方向.基于图像灰度配准的互信息配准算法,不需要对图像进行特征提取等预处理操作,人工干预较少,自动化程度较高,其配准精度也高于其他基于对图像进行分割的方法,并且该算法适用于多模态图像,鲁棒性好.2 部分代码​​close allclear all​tic​x0=[50; 50; -15; 0.5]; % Initial points, [_matlabgan网络图像配准开源项目

个人对Promise的认识_promise个人-程序员宅基地

文章浏览阅读283次。Promise 是一个 ECMAScript 6 提供的类,目的是更加优雅地书写复杂的异步任务。由于 Promise 是 ES6 新增加的,所以一些旧的浏览器并不支持,苹果的 Safari 10 和 Windows 的 Edge 14 版本以上浏览器才开始支持 ES6 特性。构造 Promise现在我们新建一个 Promise 对象:new Promise(function (resolve, reject) { // 要做的事情...});通过新建一个 Promise 对象好像并没有_promise个人

随便推点

以PLY binary little-endian format格式保存RGB3D点云_rgb little endian-程序员宅基地

文章浏览阅读2.9k次。PCL库中的3D点云包含的域相当丰富,但大多数时候我们用不到,在一些插件和脚本中使用PCL导出的PLY文件,这些多余的域可能会导致报错,因此我写了一个简单的PLY binary little-endian format格式,包含了XYZ的三维坐标信息和每个点的RGB信息。运行需要PCL库读取点云文件。#include <iostream> #include <pcl/io/pcd_io.h> #include <pcl/point_types.h>_rgb little endian

一起学微软Power BI系列-使用技巧(5)自定义PowerBI时间日期表-程序员宅基地

文章浏览阅读4.6k次,点赞2次,收藏4次。1.日期函数表作用 经常使用Excel或者PowerBI,Power Pivot做报表,时间日期是一个重要的纬度,加上做一些钻取,时间日期函数表不可避免。所以今天就给大家分享一个自定义的做日期表的方法,当然自己使用Excel用公式做一个也很快,八仙过海各显神通。我对C#比较了解,就用自己最了解的方式做了一个。大家可以自己扩充,或者可以把需求提供我,我统一完善。比如下面这个表(来自一个..._powerbi日期表的作用

SNAT原理-程序员宅基地

文章浏览阅读3k次。SNAT 策略及应用• SNAT(Source Network Address Translation,源地址转换)是Linux防火墙的一种地址转换操作,也是iptables命令中的一种数据包控制类型,其作用是根据指定条件修改数据包的源IP地址SNAT 策略概述随着internet网络的快速发展,IPv4可支持的可用IP地址资源逐渐匮乏,大部分企业面临着局域网内的主机接入internet的需求,从而通过SNAT策略来解决局域网共享上网的问题,可得以缓解。而解决IPv4地址匮乏的是 (IPv6)工作原_snat

项目实战系列——ubuntu18.04下Nginx安装与配置以及踩坑实录_高自强的博客的博客-程序员宅基地

文章浏览阅读551次。0 前言最近一个项目需要搭建集群,用到负载均衡服务器,因此尝试一下Nginx,一些安装、配置与踩坑实录如下。1 环境配置1.1 我的环境配置ubuntu18.04无jdk、无jre、无tomcat、无nginx1.2 安装jre因为tomcat是基于jre环境的,因此需要安装jre这个java运行环境。网上部分材料说要安装jdk,在这里其实是不需要jdk的。(jdk是java开发套件,像我这种不进行java开发,只需要一个java程序运行环境的,只需要配置jre就可以了)因为想到以后对j

FD.io/VPP — L2 vSwitch_vpp支持l2转发-程序员宅基地

文章浏览阅读1.5k次。目录文章目录目录L2 vSwitchL2 SwitchingL2 vSwitchVPP 可以作为一个现成的 L2 vSwitch,支持创建:Bridge DomainsPorts (including tunnel ports)Connect ports to bridge domainsProgram ARP terminationetc…L2 Switching使用 VPP1 充当 L2 vSwitch 的角色。在 Linux 上创建 veth pair vpp1out-v_vpp支持l2转发

深度学习踩坑系列之三 安装cuDNN详细步骤-程序员宅基地

文章浏览阅读1.1k次。1)下载对应版本注册账户后选定报错提示的那个版本5.0即可,我下载的是cudnn-8.0-linux-x64-v5.1.tgz2)安装Fz上传至Linux服务器指定文件夹,执行tar xvzf cudnn-8.0-linux-x64-v5.1.tgz,ls后可见cuda文件夹3)设定软链接没有在cuda目录的上层目录执行以下语句,就会报找不到对应file。正确执行路径可参考以下截图su...