Esquema de efeito de animação de exibição e ocultação de janela usando C# - artigos da série de pesquisa de código aberto

  Continue estudando o efeito de animação de exibição do WinForm de C# hoje.

  Da última vez, percebemos o efeito de animação de exibição do formulário sem borda (consulte a postagem do blog: A solução perfeita para o efeito de animação do formulário sem borda baseado em C# - artigos da série de pesquisa de código aberto ), desta vez apresentamos o formulário que não está no bandeja da barra de tarefas O código de implementação do efeito de exibição e ocultação da animação.

  1. Diretório do projeto;

  Abaixo está o diretório do projeto, que consiste em formulários básicos e classes de ação.

      

  2. Introdução do código;

  O código é relativamente simples, basta adicionar os efeitos de minimização e maximização do formulário diretamente.

  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. Interface de operação;

  Como nenhum GIF é gravado, nenhuma interface é fornecida.

  4. Como usar;

  Coloque a classe de operação diretamente no projeto e chame o método de classe estático.

 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. Download do código-fonte;

  O download do exemplo de código-fonte é fornecido aqui:

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

  O acima é o efeito de animação do formulário C# oculto no ícone da bandeja compilado pelo autor. Com o efeito do formulário sem borda da última vez, ele pode exibir melhor o efeito do formulário. O download do código-fonte e os exemplos são fornecidos, e o código pode ser reutilizado diretamente. Espero que os leitores que tenham o mesmo problema possam resolvê-lo.

Acho que você gosta

Origin blog.csdn.net/lzhdim/article/details/132138518
Recomendado
Clasificación