Добавление в трей иконки и контекстного меню в VS.NET
Для начала добавим в проект новую иконку. Нажимаем Ctrl-Shift-A, появится диалоговое окошко Add-New-Item. Из списка доступных
шаблонов выбираем Icon File. Кликаем на Open и попадаем в редактор иконок VS.NET. Редактируем иконку или копируем откуда-нибудь.
Далее, в Solution Explorer кликаем правой кнопкой мыши на нашу иконку и выбираем свойства. Меняем свойство Build Action на
Embedded Resource. Тем самым мы указываем компилятору, чтобы он включил иконку в EXE-файл.
Добавление мембера NotifyIcon в форму
Итак, иконка готова, теперь подключим её к нашему классу формы.
private NotifyIcon m_notifyicon;
Далее, необходимо инициализировать её и установить некторые дефолтовые свойства. Сделать это нужно в конструкторе объекта формы.
m_notifyicon = new NotifyIcon();
m_notifyicon.Text = "Hello, what's cooking?";
m_notifyicon.Visible = true;
m_notifyicon.Icon = new Icon(GetType(),"Icon1.ico");
Теперь компилируем и запускаем наше приложение. В трее появится наша иконка. Но просто иконка в трее бесполезна, необходимо
добавить к иконке меню.
Добавление контекстного меню к иконке в трее
Сперва добавляем к форме мембер ContextMenu.
private ContextMenu m_menu;
Затем инициализируем его и добавляем пункты меню.
m_menu = new ContextMenu();
m_menu.MenuItems.Add(0,
new MenuItem("Show",new System.EventHandler(Show_Click)));
m_menu.MenuItems.Add(1,
new MenuItem("Hide",new System.EventHandler(Hide_Click)));
m_menu.MenuItems.Add(2,
new MenuItem("Exit",new System.EventHandler(Exit_Click)));
В примере добавлется три пункта меню и три обработчика событий для каждого пункта меню. Можно было бы создать массав объектов
MenuItem, но в данном случае в этом нет необходимости. Следущим действием связываем объект ContextMenu с нашей иконкой в трее:
m_notifyicon.ContextMenu = m_menu;
Потом заполняем обработчики событий для пунктов меню:
protected void Exit_Click(Object sender, System.EventArgs e)
{
Close();
}
protected void Hide_Click(Object sender, System.EventArgs e)
{
Hide();
}
protected void Show_Click(Object sender, System.EventArgs e)
{
Show();
}
Опять компилируем и запускаем приложение. Теперь при клике правой
кнопкой по иконке будет появляться контекстное меню. В качестве
примера, три пункта меню выполняют простейшие действия: скрыть, Показать
и Закрыть приложение.
Небольшая проблема
При закрытии программы, иконка из трея не исчезает. Пропадёт она только, если подвести к ней курсор мышки. Для решения этой
проблемы наследуем собственный обработчик формы Dispose и помещаем в него свой код:
protected override void Dispose( bool disposing )
{
if( disposing )
{
this.m_notifyicon.Dispose(); //we dispose our tray icon here
}
base.Dispose( disposing );
}
Полный исходник
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Data;
namespace TrayTest
{
public class Form1 : System.Windows.Forms.Form
{
private NotifyIcon m_notifyicon;
private ContextMenu m_menu;
public Form1()
{
Text = "TrayIcon test program";
m_menu = new ContextMenu();
m_menu.MenuItems.Add(0,
new MenuItem("Show",new System.EventHandler(Show_Click)));
m_menu.MenuItems.Add(1,
new MenuItem("Hide",new System.EventHandler(Hide_Click)));
m_menu.MenuItems.Add(2,
new MenuItem("Exit",new System.EventHandler(Exit_Click)));
m_notifyicon = new NotifyIcon();
m_notifyicon.Text = "Right click for context menu";
m_notifyicon.Visible = true;
m_notifyicon.Icon = new Icon(GetType(),"Icon1.ico");
m_notifyicon.ContextMenu = m_menu;
}
protected void Exit_Click(Object sender, System.EventArgs e)
{
Close();
}
protected void Hide_Click(Object sender, System.EventArgs e)
{
Hide();
}
protected void Show_Click(Object sender, System.EventArgs e)
{
Show();
}
protected override void Dispose( bool disposing )
{
if( disposing )
{
this.m_notifyicon.Dispose();
}
base.Dispose( disposing );
}
[STAThread]
static void Main()
{
Application.Run(new Form1());
}
}
}
|