在vb6.0中,我们想要在把我们的程序以一个小图标显示在Windows桌面的应用程序托盘区(即任务栏的状态通知区域,以下都称系统托盘区),需要使用到复杂难懂的API函数来完成,而且在测试的时候还经常导致应用程序崩溃。现在用vb.net就好办多了,vb.net提供了一个 NotifyIcon 组件来让我们可以轻松完成这个工作。
NotifyIcon 组件在vb.net工具箱中如下图一所示:
当从工具箱中把 NotifyIcon 组件拖放到窗体上时,NotifyIcon 组件显示在窗体下方的组件栏中。一个 NotifyIcon 组件在系统托盘区对应显示一个图标,想要显示多个图标的话,则需要在窗体上布置多个 NotifyIcon 组件。
一、NotifyIcon 组件常用属性和事件
NotifyIcon 组件的属性和方法比较少。
1、ContextMenu 属性:用于指定与 NotifyIcon 组件相关联的上下文菜单
2、Icon 属性:用于设置 NotifyIcon 组件在系统托盘区显示的图标,注意它只支持ICO图标文件。
3、Text 属性:设置当鼠标移动到图盘区的小图标是显示的提示文本。
4、Visible 属性:用于指示在系统托盘区显示小图标是否可见。
NotifyIcon 组件只响应的鼠标事件。
二、示例
我们这里来演示如何利用 NotifyIcon 组件为自己的应用程序建立一个系统托盘图标。
1、首先把一个 NotifyIcon 组件,一个上下文菜单组件 ContextMenu(关于菜单控件的使用点击看这里)。
2、为 NotifyIcon 组件设置显示的图标:
在属性窗口中选择"Icon"属性,然后单击,在本地硬盘上找到合适的图标即可,也可以使用代码在合适的位置添加,代码添加如下所示:(假设图标文件存放在C盘下)
NotifyIcon1.Icon = New System.Drawing.Icon("c:\Icon.ico")
3、关联右键菜单:
使用 ContextMenu 属性来关联它的右键菜单。在属性窗口的"ContextMenu"中选择 ContextMenu1 组件
也可以在窗体的New事件中进行关联,代码如下:
NotifyIcon1.ContextMenu = ContextMenu1
4、为右键菜单 ContextMenu1 组件添加菜单项。如下图二所示:
并为每个菜单项添加代码,完整的菜单项代码如下所示:
Private Sub MenuItem1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem1.Click
Me.Show()'显示窗体
End Sub
Private Sub MenuItem2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem2.Click
Me.Hide()'隐藏窗体
End Sub
为了让"显示"菜单在窗体时显示状态下不可用,"隐藏"菜单在窗体隐藏状态下不可用,我们在ContextMenu1的Popup事件中加入如下代码:
Private Sub ContextMenu1_Popup(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ContextMenu1.Popup
If Me.Visible = False Then
MenuItem1.Enabled = True
MenuItem2.Enabled = False
ElseIf Me.Visible = True Then
MenuItem1.Enabled = False
MenuItem2.Enabled = True
End If
End Sub
运行,将会在系统托盘区显示我们的图标,如下图三所示:
我们通过弹出菜单上的"隐藏"\"显示"就可以进行相应的操作了。
以上我们实现的右键菜单的功能,我们还可以在图标的单击事件中响应鼠标的左键事件,下面的例子演示了如何实现单击弹出左键菜单。
因为 ContextMenu 组件是默认关联鼠标的右击事件的,所以我们需要通过其它的途径来实现左击菜单。
现在窗体上建立一个名为 ContextMenu2 的菜单,菜单项如下图四所示:
由于不能在notifyIcon上直接显示上下文菜单,只有创建一个Control作为容器来显示菜单,详细代码如下所示:
Private Sub NotifyIcon1_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles NotifyIcon1.MouseDown
If e.Button = MouseButtons.Left Then
Dim control As New Control(Nothing, control.MousePosition.X, control.MousePosition.Y, 1, 1)
control.Visible = True
control.CreateControl()
Dim pos As New Point(0, 0) '这里的两个数字要根据你的上下文菜单大小适当地调整
Me.ContextMenu2.Show(control, pos)
End If
End Sub
本文作者: