今天继续研究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 }
因为没录制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#的窗体隐藏到托盘图标中的动画效果,搭配上次的无边框窗体的效果,更好的能够对窗体的效果进行显示。提供了源码下载及例子,能够直接进行代码复用即可,希望对同样问题的读者能够解决该问题。
Austin Liu 刘恒辉
Project Manager and Software Designer E-Mail:lzhdim@163.com Blog:https://lzhdim.cnblogs.com 欢迎收藏和转载此博客中的博文,但是请注明出处,给笔者一个与大家交流的空间。谢谢大家。 |