当前位置: 首页 > news >正文

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

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

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

  1、 项目目录;

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

      

  2、 代码介绍;

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

  1 namespace Lzhdim.Helper2 {3     using System.Runtime.InteropServices;4     using System;5     using System.Windows.Forms;6 7 8     /// <summary>9     /// 窗体状态10     /// </summary>11     internal enum ShowWindowState12     {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         RunningShow41     }42 43     /// <summary>44     /// 显示隐藏窗体状态操作类45     /// 46     /// 窗体的状态都通过此API进行处理47     /// </summary>48     internal static class ShowWindowHelper49     {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#的窗体隐藏到托盘图标中的动画效果,搭配上次的无边框窗体的效果,更好的能够对窗体的效果进行显示。提供了源码下载及例子,能够直接进行代码复用即可,希望对同样问题的读者能够解决该问题。

相关文章:

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

今天继续研究C#的WinForm的显示动画效果。 上次我们实现了无边框窗体的显示动画效果(见博文&#xff1a;基于C#的无边框窗体动画效果的完美解决方案 - 开源研究系列文章 )&#xff0c;这次介绍的是未在任务栏托盘中窗体的显示隐藏动画效果的实现代码。 1、 项目目录&#xff1b…...

09_Vue3中的 toRef 和 toRefs

toRdf 作用&#xff1a;创建一个 ref 对象&#xff0c;其 value 值指向另一个对象中的某个属性。语法&#xff1a; const name toRef(person,name) 应用&#xff1a;要将响应式对象中的某个属性单独提供给外部使用时。扩展&#xff1a;toRef 与 toRefs 功能一致&#xff0…...

JAVA获取视频音频时长 文件大小 MultipartFileUtil和file转换

java 获取视频时长_java获取视频时长_似夜晓星辰的博客-CSDN博客 <dependency><groupId>ws.schild</groupId><artifactId>jave-all-deps</artifactId><version>2.5.1</version></dependency>Slf4j public class VideoTimeUtil…...

刷题笔记 day9

1658 将 x 减到 0 的最小操作数 解析&#xff1a;1. 当数组的两端的数都大于x时&#xff0c;直接返回 -1。 2. 当数组所有数之和小于 x 时 &#xff0c;直接返回 -1。 3. 数组中可以将 x 消除为0&#xff0c;那么可以从左边减小为 0 &#xff1b;可以从右边减小为 0 &#xff1…...

小白解密ChatGPT大模型训练;Meta开源生成式AI工具AudioCraft

&#x1f989; AI新闻 &#x1f680; Meta开源生成式AI工具AudioCraft&#xff0c;帮助用户创作音乐和音频 摘要&#xff1a;美国公司Meta开源了一款名为AudioCraft的生成式AI工具&#xff0c;可以通过文本提示生成音乐和音频。该工具包含三个核心组件&#xff1a;MusicGen用…...

1 swagger简单案例

1.1 加入依赖 <!--swagger图形化接口--><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9.2</version> </dependency><dependency><groupId>io.spri…...

Flutter写一个android底部导航栏框架

废话不多说&#xff0c;上代码&#xff1a; import package:flutter/material.dart;void main() {runApp(MyApp()); }class MyApp extends StatelessWidget {overrideWidget build(BuildContext context) {return MaterialApp(title: Bottom Navigation Bar,theme: ThemeData(…...

关于自动化测试用例失败重试的一些思考

自动化测试用例失败重跑有助于提高自动化用例的稳定性&#xff0c;那我们来看一下&#xff0c;python和java生态里都有哪些具体做法&#xff1f; 怎么做 如果是在python生态里&#xff0c;用pytest做测试驱动&#xff0c;那么可以通过pytest的插件pytest-rerunfailures来实现…...

JS逆向之顶像滑块

本教程仅限于学术探讨&#xff0c;也没有专门针对某个网站而编写&#xff0c;禁止用于非法用途、商业活动、恶意滥用技术等&#xff0c;否则后果自负。观看则同意此约定。如有侵权&#xff0c;请告知删除&#xff0c;谢谢&#xff01; 目录 一、接口请求流程 二、C1包 三、ac 四…...

【css】textarea-通过resize:none 禁止拖动设置大小

使用 resize 属性可防止调整 textareas 的大小&#xff08;禁用右下角的“抓取器”&#xff09;&#xff1a; 没有设置resize:none 代码&#xff1a; <!DOCTYPE html> <html> <head> <style> textarea {width: 100%;height: 150px;padding: 12px 20p…...

Linux内核学习小结

网上学习总结的一些资料&#xff0c;加上个人的一些总结。 Linux内核可以分成基础层和应用层。 基础层包括数据结构&#xff0c;内核同步机制&#xff0c;内存管理&#xff0c;任务调度。 应用层包括文件系统&#xff0c;设备和驱动&#xff0c;网络&#xff0c;虚拟化等。文件…...

八、ESP32控制8x8点阵屏

引脚的说明如下 上图中 C表示column 列的意思,所有的C接高电压,即控制esp32中输出1L表示line 行的意思,所有的L接低电压,即控制esp32中输出为01. 运行效果 2. 点阵屏引脚...

使用gitee创建远程maven仓库

1. 创建一个项目作为远程仓库 2. 打包项目发布到远程仓库 id随意&#xff0c;url是打包到哪个文件夹里面 在需要打包的项目的pom中添加 <distributionManagement><repository><id>handsomehuang-maven</id><url>file:D:/workspace/java/2023/re…...

基于C#的应用程序单例唯一运行的完美解决方案 - 开源研究系列文章

今次介绍一个应用程序单例唯一运行方案的代码。 我们知道&#xff0c;有些应用程序在操作系统中需要单例唯一运行&#xff0c;因为程序多开的话会对程序运行效果有影响&#xff0c;最基本的例子就是打印机&#xff0c;只能运行一个实例。这里将笔者单例运行的代码共享出来&…...

2023-08-07力扣今日二题

链接&#xff1a; 剑指 Offer 29. 顺时针打印矩阵 题意&#xff1a; 如题 解&#xff1a; 麻烦的简单题&#xff0c;具体操作类似走地图&#xff0c;使用一个长度四的数组表示移动方向 我这边的思路是如果按正常的方向没有路走了&#xff0c;那转向下一个方向一定有路&am…...

Spring接口ApplicationRunner的作用和使用介绍

在Spring框架中&#xff0c;ApplicationRunner接口是org.springframework.boot.ApplicationRunner接口的一部分。它是Spring Boot中用于在Spring应用程序启动完成后执行特定任务的接口。ApplicationRunner的作用是在Spring应用程序完全启动后&#xff0c;执行一些初始化任务或处…...

奶牛排队 java 思维题

&#x1f468;‍&#x1f3eb; 5133. 奶牛排队 题目描述 约翰的农场有 n n n 头奶牛&#xff0c;每一头奶牛都有一个正整数编号。 不同奶牛的编号不同。 现在&#xff0c;这 n n n 头牛按某种顺序排成一队&#xff0c;每头牛都拿出一张纸条写下了其前方相邻牛的编号以及其…...

uniapp 微信小程序 判断数据返回的是jpg还是pdf,以及pdf预览

<template> <view class"approval-notice"><block v-for"(imgItem, idx) in drivingLicense" :key"idx">//如果是非图片&#xff0c;那就走pdf预览<view class"pdf-item" v-if"Object.keys(thumbnail).incl…...

SpringBoot 的事务及使用

一、事务的常识 1、事务四特性&#xff08;ACID&#xff09; A 原子性&#xff1a;事务是最小单元,不可再分隔的一个整体。C 一致性&#xff1a;事务中的方法要么同时成功,要么都不成功,要不都失败。I 隔离性&#xff1a;多个事务操作数据库中同一个记录或多个记录时,对事务进…...

Android中的ABI

Android中的ABI ABI是Application Binary Interface的缩写。 ABI常表示两个程序模块之间的接口&#xff0c;且其中一个模块常为机器码级别的library或操作系统。 ABI定义了函数库的调用、应用的二进制文件&#xff08;尤其是.so&#xff09;如何运行在相应的系统平台上等细节…...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

分布式增量爬虫实现方案

之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面&#xff0c;避免重复抓取&#xff0c;以节省资源和时间。 在分布式环境下&#xff0c;增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路&#xff1a;将增量判…...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采样率&#xff0c;集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器&#xff0c;适用于高保真音频采集场景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…...

初探Service服务发现机制

1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能&#xff1a;服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源&#xf…...

免费PDF转图片工具

免费PDF转图片工具 一款简单易用的PDF转图片工具&#xff0c;可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件&#xff0c;也不需要在线上传文件&#xff0c;保护您的隐私。 工具截图 主要特点 &#x1f680; 快速转换&#xff1a;本地转换&#xff0c;无需等待上…...

【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error

在前端开发中&#xff0c;JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作&#xff08;如 Promise、async/await 等&#xff09;&#xff0c;开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝&#xff08;r…...

Ubuntu系统多网卡多相机IP设置方法

目录 1、硬件情况 2、如何设置网卡和相机IP 2.1 万兆网卡连接交换机&#xff0c;交换机再连相机 2.1.1 网卡设置 2.1.2 相机设置 2.3 万兆网卡直连相机 1、硬件情况 2个网卡n个相机 电脑系统信息&#xff0c;系统版本&#xff1a;Ubuntu22.04.5 LTS&#xff1b;内核版本…...

WEB3全栈开发——面试专业技能点P4数据库

一、mysql2 原生驱动及其连接机制 概念介绍 mysql2 是 Node.js 环境中广泛使用的 MySQL 客户端库&#xff0c;基于 mysql 库改进而来&#xff0c;具有更好的性能、Promise 支持、流式查询、二进制数据处理能力等。 主要特点&#xff1a; 支持 Promise / async-await&#xf…...