使用C#的窗体显示与隐藏动画效果方案 - 开源研究系列文章

news2024/11/25 2:36:33

  今天继续研究C#的WinForm的显示动画效果。

  上次我们实现了无边框窗体的显示动画效果(见博文:基于C#的无边框窗体动画效果的完美解决方案 - 开源研究系列文章 ),这次介绍的是未在任务栏托盘中窗体的显示隐藏动画效果的实现代码。

  1、 项目目录;

  下面是项目目录,由基本的窗体和操作类组成。

      

  2、 代码介绍;

  代码比较简单,直接将窗体的最小化、最大化效果加入进去即可。

  1 namespace Lzhdim.Helper
  2 {
  3     using System.Runtime.InteropServices;
  4     using System;
  5     using System.Windows.Forms;
  6 
  7 
  8     /// <summary>
  9     /// 窗体状态
 10     /// </summary>
 11     internal enum ShowWindowState
 12     {
 13         /// <summary>
 14         /// 显示窗体
 15         /// </summary>
 16         Show,
 17         /// <summary>
 18         /// 隐藏窗体
 19         /// </summary>
 20         Hide,
 21         /// <summary>
 22         /// 最小化窗体
 23         /// </summary>
 24         Min,
 25         /// <summary>
 26         /// 最大化窗体
 27         /// </summary>
 28         Max,
 29         /// <summary>
 30         /// 直接调用窗体的显示
 31         /// </summary>
 32         DirectShow,
 33         /// <summary>
 34         /// 直接调用窗体的隐藏
 35         /// </summary>
 36         DirectHide,
 37         /// <summary>
 38         /// 窗体有运行实例时的显示
 39         /// </summary>
 40         RunningShow
 41     }
 42 
 43     /// <summary>
 44     /// 显示隐藏窗体状态操作类
 45     /// 
 46     /// 窗体的状态都通过此API进行处理
 47     /// </summary>
 48     internal static class ShowWindowHelper
 49     {
 50         [DllImport("User32.dll")]
 51         private static extern bool SetForegroundWindow(IntPtr hWnd);
 52         [DllImport("User32.dll")]
 53         private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);
 54 
 55         //API 常數定義
 56 
 57         private const int SW_HIDE = 0;
 58         private const int SW_NORMAL = 1;
 59         private const int SW_MAXIMIZE = 3;
 60         private const int SW_SHOWNOACTIVATE = 4;
 61         private const int SW_SHOW = 5;
 62         private const int SW_MINIMIZE = 6;
 63         private const int SW_RESTORE = 9;
 64         private const int SW_SHOWDEFAULT = 10;
 65 
 66         /// <summary>
 67         /// 设置窗体状态
 68         /// </summary>
 69         /// <param name="form">要设置的窗体</param>
 70         /// <param name="windowState">窗体状态</param>
 71         internal static void ShowWindow(Form form, ShowWindowState windowState)
 72         {
 73             switch (windowState)
 74             {
 75                 case ShowWindowState.Show:
 76                     form.Visible = true;
 77                     form.WindowState = System.Windows.Forms.FormWindowState.Normal;
 78                     form.ShowInTaskbar = true;
 79                     break;
 80                 case ShowWindowState.Hide:
 81                     //这里两个Visible是为了关闭时的动画效果
 82                     form.Visible = false;
 83                     form.WindowState = System.Windows.Forms.FormWindowState.Minimized;
 84                     form.ShowInTaskbar = false;
 85                     form.Visible = false;
 86                     break;
 87                 case ShowWindowState.Min:
 88                     form.Visible = true;
 89                     form.WindowState = System.Windows.Forms.FormWindowState.Minimized;
 90                     break;
 91                 case ShowWindowState.Max:
 92                     form.Visible = true;
 93                     form.WindowState = System.Windows.Forms.FormWindowState.Maximized;
 94                     break;
 95                 case ShowWindowState.DirectShow:
 96                     form.Show();
 97                     break;
 98                 case ShowWindowState.DirectHide:
 99                     form.Hide();
100                     break;
101                 case ShowWindowState.RunningShow:
102                     //保存窗体现在的状态
103                     FormWindowState formWindowState = form.WindowState;
104                     bool visible = form.Visible;
105 
106                     //下面显示窗体
107                     form.Visible = true;
108                     form.ShowInTaskbar = true;
109 
110                     if (visible)
111                     {
112                         //如果在状态栏显示状态,则直接还原
113                         switch (formWindowState)
114                         {
115                             case FormWindowState.Minimized:
116                                 //如果是最小化状态,则还原原来的状态,比如正常或者最大化
117                                 ShowWindowAsync(form.Handle, SW_RESTORE);
118                                 break;
119                         }
120                     }
121                     else
122                     {
123                         //如果是隐藏状态
124                         switch(formWindowState)
125                         {
126                             case FormWindowState.Maximized:
127                                 //原来是最大化的就最大化显示
128                                 ShowWindowAsync(form.Handle, SW_MAXIMIZE);
129                                 break;
130                             case FormWindowState.Minimized:
131                             case FormWindowState.Normal:
132                                 //如果是正常或者最小化则正常状态显示
133                                 ShowWindowAsync(form.Handle, SW_NORMAL);
134                                 break;
135                         }
136                     }
137                     //最后将窗体置于最前显示
138                     SetForegroundWindow(form.Handle);
139 
140                     break;
141             }
142         }
143     }
144 }
   3、 运行界面;

  因为没录制GIF,所以不提供界面了。

  4、 使用方法;

  直接将操作类放到项目里面,然后调用静态类方法即可。

 1 /// <summary>
 2         /// 隐藏窗体按钮事件
 3         /// </summary>
 4         /// <param name="sender"></param>
 5         /// <param name="e"></param>
 6         private void btnHide_Click(object sender, EventArgs e)
 7         {
 8             ShowWindowHelper.ShowWindow(this, ShowWindowState.Hide);
 9         }
10         
11         /// <summary>
12         /// 图标单击事件
13         /// </summary>
14         /// <param name="sender"></param>
15         /// <param name="e"></param>
16         private void NIShowWindow_MouseClick(object sender, MouseEventArgs e)
17         {
18             if(e.Button == MouseButtons.Left)
19             {
20                 ShowWindowHelper.ShowWindow(this, ShowWindowState.Show);
21             }
22         }
23         /// <summary>
24         /// 图标双击事件
25         /// </summary>
26         /// <param name="sender"></param>
27         /// <param name="e"></param>
28         private void NIShowWindow_MouseDoubleClick(object sender, MouseEventArgs e)
29         {
30             if (e.Button == MouseButtons.Left)
31             {
32                 //这里调用Hide程序会退出,所以直接调默认的Hide函数
33                 ShowWindowHelper.ShowWindow(this, ShowWindowState.DirectHide);
34             }
35         }

  5、 源码下载;

  这里提供源码例子下载:

       https://download.csdn.net/download/lzhdim/88171194

  上面是笔者整理的关于C#的窗体隐藏到托盘图标中的动画效果,搭配上次的无边框窗体的效果,更好的能够对窗体的效果进行显示。提供了源码下载及例子,能够直接进行代码复用即可,希望对同样问题的读者能够解决该问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/845236.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

(03)Unity HTC VRTK 基于 URP 开发记录

1.简介 本篇主要内容为&#xff1a;URP如何与VRTK结合、URP需要注意的地方、VRTK的功能进行阐述。 因项目本身要求要渲染出比较好的画质&#xff0c;所以抛弃了Unity默认渲染管线Built-in&#xff0c;使用URP进行渲染&#xff0c;当然也可以选HDRP&#xff0c;但考虑到后期项目…

STM32 4G学习(二)

特性参数 ATK-IDM750C是正点原子开发的一款高性能4G Cat1 DTU产品&#xff0c;支持移动4G、联通4G和电信4G手机卡。 它以高速率、低延迟和无线数传作为核心功能&#xff0c;可快速解决应用场景下的无线数传方案。 它支持TCP/UDP/HTTP/MQTT/DNS/RNDIS/NTP协议&#xff0c;支持…

第八篇: K8S Prometheus Operator实现Ceph集群企业微信机器人告警

Prometheus Operator实现Ceph集群企业微信告警 实现方案 我们的k8s集群与ceph集群是部署在不同的服务器上&#xff0c;因此实现方案如下&#xff1a; (1) ceph集群开启mgr内置的exporter服务&#xff0c;用于获取ceph集群的metrics (2) k8s集群通过 Service Endponit Ser…

Nacos源码 (2) 核心模块

返回目录 整体架构 服务管理&#xff1a;实现服务CRUD&#xff0c;域名CRUD&#xff0c;服务健康状态检查&#xff0c;服务权重管理等功能配置管理&#xff1a;实现配置管CRUD&#xff0c;版本管理&#xff0c;灰度管理&#xff0c;监听管理&#xff0c;推送轨迹&#xff0c;聚…

计算机组成原理-笔记-第一章

目录 一、第一章——计算机系统概述&#xff08;硬件软件&#xff09; 1、计算机发展 &#xff08;1&#xff09;小结 2、硬件的基本组成&#xff08;冯诺依曼机&#xff09; &#xff08;1&#xff09;冯诺依曼机——运算器为中心 &#xff08;2&#xff09;现代计算器结…

微服务 云原生:搭建 Harbor 私有镜像仓库

Harbor官网 写在文前&#xff1a; 本文中用到机器均为虚拟机 CentOS-7-x86_64-Minimal-2009 镜像。 基础设施要求 虚拟机配置达到最低要求即可&#xff0c;本次系统中使用 docker 24.0.4、docker-compose 1.29.2。docker 及 docker-compose 的安装可以参考上篇文章 微服务 &am…

《HeadFirst设计模式(第二版)》第七章代码——适配器模式

代码文件目录&#xff1a; Example1: Duck package Chapter7_AdapterAndFacadePattern.Adapter.Example1;/*** Author 竹心* Date 2023/8/7**/public interface Duck {public void quack();public void fly(); }DuckTestDrive package Chapter7_AdapterAndFacadePattern.Ada…

Vue2源码分析-day1

初始化数据 vue中最核心的我们都知道那就是响应式数据&#xff0c;数据的变化视图自动更新。那么我们来new一个我们自己的vue 在index.html文件下加入如下代码&#xff0c;这也是vue最常见的基本结构。data已经有了下面我们来获取data的数据 <script src"./vue.js&qu…

怎么快速搭建BI?奥威BI系统做出了表率

搭建BI系统有两大关键&#xff0c;分别是环境搭建和数仓建设。这两点不管是哪一个都相当地费时费力&#xff0c;那要怎么才能快速搭建BI平台&#xff0c;顺利实现全企业数字化运营决策&#xff1f;奥威BI系统方案&#xff0c;你值得拥有&#xff01; 奥威BI系统方案&#xff0…

VS+Qt环境下解决中文乱码问题

目录 原因解决方案总结 原因 使用VSQt出现中文乱码的情况一般都是给控件添加中文文本时出现&#xff0c;而控件需要的字符串类型是QString&#xff0c;默认是utf-8。在 Visual Studio 中&#xff0c;源代码文件的默认执行字符集可能是 Windows 默认的 ANSI 字符集&#xff0c;…

0基础学习VR全景平台篇 第79篇:全景相机-泰科易如何直播推流

泰科易科技是中国的一家研发全景相机的高科技公司&#xff0c;前不久&#xff0c;在2020世界VR产业大会上发布了新一代5G VR直播影像采集终端--360starlight。以其出色的夜景成像效果和一“部”到位的直播方案重新定义了VR慢直播相机&#xff0c;对行业具有高度借鉴意义。 本文…

吸取图片指定点的颜色-微信小程序

“远看色,近看形,细看质”&#xff0c;我不是设计师&#xff0c;所以彩色那么美&#xff0c;却总也不会用&#xff0c;就想要是有一款颜色的工具可以帮助使用颜色&#xff0c;那不挺好&#xff1f;网上找了一些&#xff0c;要不就不是自己想要的&#xff0c;要不就是收费的&…

【HCIP】OSPF综合实验

题目&#xff1a; 配置&#xff1a; R1 //ip分配 [r1]int g0/0/0 [r1-GigabitEthernet0/0/0]ip add 172.16.0.1 27 [r1-GigabitEthernet0/0/0]q [r1]int lo [r1]int LoopBack 0 [r1-LoopBack0]ip add 172.16.1.1 24//配置缺省 [r1]ip route-static 0.0.0.0 0 172.16.0.3 //启动…

PHP8的循环控制语句-PHP8知识详解

我们在上一节讲的是条件控制语句&#xff0c;本节课程我们讲解循环控制语句。循环控制语句中&#xff0c;主要有for循环、while循环、do...while循环和foreach循环。 在编写代码时&#xff0c;经常需要反复运行同一代码块。我们可以使用循环来执行这样的任务&#xff0c;而不是…

Data analysis|Tableau基本介绍及可基础可实现功能

一、基础知识介绍 &#xff08;一&#xff09;什么是tableau tableau 成立于 2003 年&#xff0c;是斯坦福大学一个计算机科学项目的成果&#xff0c;该项目旨在改善分析流程并让人们能够通过可视化更轻松地使用数据。Tableau可以帮助用户更好地理解和发现数据中的价值&#x…

Packet Tracer - IPv4 和 IPv6 编址故障排除

Packet Tracer - IPv4 和 IPv6 编址故障排除 地址分配表 设备 接口 IPv4 地址 子网掩码 默认网关 IPv6 地址/前缀 R1 G0/0 10.10.1.1 255.255.255.0 N/A G0/1 192.168.0.1 255.255.255.0 N/A 2001:DB8:1:1::1/64 N/A G0/2 2001:DB8:1:2::1/64 N/A S0/0/0 …

汽车用功率电感器

支持车载用被动元件的可靠性认证测试标准“AEC-Q200”的绕线铁氧体功率电感器 LCXH 系列实现商品化&#xff0c;推出了“LCXHF3030QK”等 6 个尺寸的 64 款商品。 这些商品均是用于汽车车身类及信息娱乐等信息类的电源电路用扼流线圈及噪音滤波器的功率电感器。 LCXH 系列与民生…

Xorm开发详细文档

文章目录 介绍特性支持的数据库安装 创建 Engine单引擎日志连接池 引擎组引擎组策略负载策略 定义表结构体各种映射规则前缀映射&#xff0c;后缀映射和缓存映射使用 Table 和 Tag 改变名称映射Column 属性定义Go与字段类型对应表 表结构操作获取数据库信息表操作创建索引和唯一…

MySQL — 存储引擎

文章目录 存储引擎存储引擎类型InnoDBMyISAMMEMORY 存储引擎是数据库的核心&#xff0c;对于mysql来说&#xff0c;存储引擎是以插件的形式运行的。虽然mysql支持种类繁多的存储引擎&#xff0c;但是常用的就那么几种。这篇文章主要是对其进行简单的介绍。 存储引擎 MySQL可插…

Kubernetes关于cpu资源分配的设计

kubernetes资源 在K8s中定义Pod中运行容器有两个维度的限制: 资源需求(Requests):即运行Pod的节点必须满足运行Pod的最基本需求才能运行Pod。如 Pod运行至少需要2G内存,1核CPU。(软限制)资源限额(Limits):即运行Pod期间,可能内存使用量会增加,那最多能使用多少内存,这…