Меню сайта
Категории раздела
Разное
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Среда, 15.05.2024, 00:17
Приветствую Вас Гость

Каталог статей

Главная » Статьи » Статьи » Разное

Добавление в трей иконки и контекстного меню

Добавление в трей иконки и контекстного меню в 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());
 }
 
 }
}
Категория: Разное | Добавил: admin (19.12.2011)
Просмотров: 732
Форма входа
Поиск
Друзья сайта
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz