Поиск на сайте
Главная Журнал Форум Wiki DRKB Страны мира

Добавление в трей иконки и контекстного меню в 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());
        }
        
    }
}




Основные разделы сайта


 

Реклама Объявления, курсы, обучение: уроки вокала цена. Ценная информация из мира машин.