C#实现闪动托盘图标效果的方法

时间:2021-10-29 15:06:33

本文实例讲述了C#实现闪动托盘图标效果的方法。分享给大家供大家参考,具体如下:

在用户正在登录QQ或者使用Firemail邮件系统自动收取邮件的时候,托盘图标会闪动提示用户正在运行的任务。

闪动图标可以使用定时切换托盘图标的方式实现,托盘图标可以从ImageList控件中获取。在ImageList控件里面添加三个icon,第一个icon表示窗体启动以后的托盘图标。第二个和第三个图标分别表示当特定的任务发生的时候,定时切换的图标。

(1)设置托盘的图标可以从ImageList控件中的Image对象转换为Icon对象

?
1
2
3
4
5
6
7
8
9
10
11
/// <summary>
/// 设置托盘显示的图标
/// </summary>
/// <param name="index">图像列表中图片的索引</param>
private void setIconImg(int index)
{
  Image img = this.imgIcon.Images[index];
  Bitmap b = new Bitmap(img);
  Icon icon = Icon.FromHandle(b.GetHicon());
  this.niMain.Icon = icon;
}

(2)定时器事件实现图标的切换

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/// <summary>
/// 定时器切换图标显示
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void tmrIcon_Tick(object sender, EventArgs e)
{
  if (iconFlag)
  {
    this.setIconImg(1);
    iconFlag = !iconFlag;
  }
  else
  {
    this.setIconImg(2);
    iconFlag = !iconFlag;
  }
}

(3)窗体的最小化按钮和关闭按钮实现隐藏窗体的功能,窗体关闭时,会执行FormClosing 事件,释放与此窗体关联的所有资源。因此需要取消关闭事件,实现窗体的隐藏和托盘的显示功能。

?
1
2
3
4
5
6
7
8
9
10
11
/// <summary>
/// 关闭窗体时隐藏窗体显示托盘图标
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void FrmMain_FormClosing(object sender, FormClosingEventArgs e)
{
  e.Cancel = true;
  this.Hide();
  this.niMain.Visible = true;
}

(4)托盘关联菜单有四个功能:

① “显示” :显示主窗体、隐藏托盘图标。
② “运行”:图标闪动效果,模拟任务正在运行。
③ “停止”:恢复初始化的图标,模拟任务停止。
④ “退出”:提示用户并退出应用系统。
完整的代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
namespace NotifyIconDemo
{
  public partial class FrmMain : Form
  {
    //切换图片的标识
    private bool iconFlag = false;
    //系统是否运行
    private bool isRun = false;
    /// <summary>
    ///
    /// </summary>
    public FrmMain()
    {
      InitializeComponent();
      //设置icon显示的图片
      this.setIconImg(0);
    }
    /// <summary>
    /// 设置托盘显示的图标
    /// </summary>
    /// <param name="index">图像列表中图片的索引</param>
    private void setIconImg(int index)
    {
      Image img = this.imgIcon.Images[index];
      Bitmap b = new Bitmap(img);
      Icon icon = Icon.FromHandle(b.GetHicon());
      this.niMain.Icon = icon;
    }
    /// <summary>
    /// 显示主窗体
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void tsmiMain_Click(object sender, EventArgs e)
    {
      //显示主窗体
      this.Visible = true;
      this.WindowState = System.Windows.Forms.FormWindowState.Normal;
      //隐藏托盘图标
      this.niMain.Visible = false;
      this.Show();
    }
    /// <summary>
    /// 退出
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void tsmiExit_Click(object sender, EventArgs e)
    {
      //设置托盘的提示信息
      this.niMain.BalloonTipText = "成功退出Demo!";
      this.niMain.BalloonTipTitle = "退出";
      this.niMain.ShowBalloonTip(1000*3);
      //延迟退出
      Thread.Sleep(1000 * 2);
      //释放托盘图标资源
      this.niMain.Dispose();
      //终止线程
      Application.ExitThread();
    }
    /// <summary>
    /// 最小化时隐藏窗体,显示托盘图标
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void FrmMain_SizeChanged(object sender, EventArgs e)
    {
      if (this.WindowState == FormWindowState.Minimized)
      {
        this.Hide();
        this.niMain.Visible = true;
      }
    }
    /// <summary>
    /// 关闭窗体时隐藏窗体显示托盘图标
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void FrmMain_FormClosing(object sender, FormClosingEventArgs e)
    {
      e.Cancel = true;
      this.Hide();
      //this.ShowInTaskbar = false;//取消窗体在任务栏的显示
      this.niMain.Visible = true;
    }
    /// <summary>
    /// 加载窗体时隐藏窗体
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void FrmMain_Load(object sender, EventArgs e)
    {
      this.Hide();
    }
    /// <summary>
    /// 定时器切换图标显示
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void tmrIcon_Tick(object sender, EventArgs e)
    {
      if (!this.isRun)
      {
        return;
      }
      if (iconFlag)
      {
        this.setIconImg(1);
        iconFlag = !iconFlag;
      }
      else
      {
        this.setIconImg(2);
        iconFlag = !iconFlag;
      }
    }
    /// <summary>
    /// 点击运行菜单
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void tsmiRun_Click(object sender, EventArgs e)
    {
      this.tsmiRun.Enabled = false;
      this.tsmiStop.Enabled = true;
      //设置运行状态
      this.isRun = true;
    }
    /// <summary>
    /// 点击停止菜单
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void tsmiStop_Click(object sender, EventArgs e)
    {
      this.tsmiRun.Enabled = true;
      this.tsmiStop.Enabled = false;
      //设置为停止状态
      this.isRun = false;
      //恢复图标显示
      this.setIconImg(0);
    }
  }
}

希望本文所述对大家C#程序设计有所帮助。