C# | Добавление в трей иконки и контекстного меню в VS.NET

Тема в разделе "C++ / C# / .NET", создана пользователем Евгенька, 28 мар 2015.

  1. Гость, давай поддержим форум вместе, делись информацией с друзями через кнопки в блоке "Поделиться в социальных сетях"

    Скрыть объявление
  1. Евгенька

    Евгенька Banned

    
    Регистр:
    20 фев 2015
    Сообщения:
    153
    Лайки:
    192
    Дизлайки:
    0
    Баллы:
    30
    Пол:
    Мужской
    [​IMG]

    Далее, в Solution Explorer кликаем правой кнопкой мыши на нашу иконку и выбираем свойства. Меняем свойство Build Action на Embedded Resource. Тем самым мы указываем компилятору, чтобы он включил иконку в EXE-файл.

    [​IMG]

    Добавление мембера NotifyIcon в форму
    Итак, иконка готова, теперь подключим её к нашему классу формы.
    PHP:
    private NotifyIcon m_notifyicon;
    Далее, необходимо инициализировать её и установить некторые дефолтовые свойства. Сделать это нужно в конструкторе объекта формы.
    PHP:
    m_notifyicon = new NotifyIcon();
    m_notifyicon.Text "Hello, what's cooking?";
    m_notifyicon.Visible true;
    m_notifyicon.Icon = new Icon(GetType(),"Icon1.ico");
    Теперь компилируем и запускаем наше приложение. В трее появится наша иконка. Но просто иконка в трее бесполезна, необходимо добавить к иконке меню.

    Добавление контекстного меню к иконке в трее
    Сперва добавляем к форме мембер ContextMenu.
    PHP:
    private ContextMenu m_menu;  
    Затем инициализируем его и добавляем пункты меню.
    PHP:
    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 с нашей иконкой в трее:
    PHP:
    m_notifyicon.ContextMenu m_menu;
    Потом заполняем обработчики событий для пунктов меню:
    PHP:
    protected void Exit_Click(Object senderSystem.EventArgs e)
    {
        
    Close();
    }
    protected 
    void Hide_Click(Object senderSystem.EventArgs e)
    {
        
    Hide();
    }
    protected 
    void Show_Click(Object senderSystem.EventArgs e)
    {
        
    Show();
    }
    Опять компилируем и запускаем приложение. Теперь при клике правой кнопкой по иконке будет появляться контекстное меню. В качестве примера, три пункта меню выполняют простейшие действия: скрыть, Показать и Закрыть приложение.

    Небольшая проблема
    При закрытии программы, иконка из трея не исчезает. Пропадёт она только, если подвести к ней курсор мышки. Для решения этой проблемы наследуем собственный обработчик формы Dispose и помещаем в него свой код:
    PHP:
    protected override void Disposebool disposing )
    {
        if( 
    disposing )
        {
            
    this.m_notifyicon.Dispose(); //we dispose our tray icon here

        
    }
        
    base.Disposedisposing );
    }
    Полный исходник

    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 senderSystem.EventArgs e)
            {
                
    Close();
            }
            protected 
    void Hide_Click(Object senderSystem.EventArgs e)
            {
                
    Hide();
            }
            protected 
    void Show_Click(Object senderSystem.EventArgs e)
            {
                
    Show();
            }
           
            protected 
    override void Disposebool disposing )
            {
                if( 
    disposing )
                {
                    
    this.m_notifyicon.Dispose();
                }
                
    base.Disposedisposing );
            }
           
            [
    STAThread]
            static 
    void Main()
            {
                
    Application.Run(new Form1());
            }
           
        }
    }