C#, динамическая NotifyIcon, иконка в области уведомления

Давно посматривал на всякие приложения типа Process Explorer или Aida, которые могли создавать в трее иконки, что-нибудь динамически отображающие. Например, Process Explorer может показывать график загрузки ЦП:

Решил попробовать сделать что-то подобное. Оказывается, ничего сверхъестественного не было. Не стал пытаться изобразить график, сделал динамическое отображение заданного текста на иконке.

1. В приложение Windows Forms надо добавить, собственно, NotifyIcon. Пусть будет с именем niMain.

2. Иконка в трее должна быть размером 16×16, заведем соответствующие переменные:

int iwidth = 16; int iheight = 16;

3. Потребуется строковая переменная, хранящая отрисовываемый текст, объект Font и объект Bitmap, который будет хранить динамически отрисовываемое изображение

string DSt = "";
Font fnt = null;
Bitmap bitm = null;

4. В MSDN настоятельно рекомендуют после программного создания иконки, удалять ее с помощью функции DestroyIcon из user32.dll, для предотвращения утечки памяти. Не буду отступать от рекомендаций MSDN, и функцию экспортирую:

[System.Runtime.InteropServices.DllImport("user32.dll", 
            CharSet = System.Runtime.InteropServices.CharSet.Auto)]
        extern static bool DestroyIcon(IntPtr handle);

5. Создаем нужный Font и пустой Bitmap необходимого размера:

private void frmTest_Load(object sender, EventArgs e)
{
    fnt = new Font("Courier new", 8, FontStyle.Bold);
    bitm = new Bitmap(iwidth, iheight);        
}

6. Отрисовываем изображение:

— Создаем объект Graphics, который будет заниматься отрисовкой. Объект Graphics можно получить для определенного ранее Bitmap'а:

Graphics graph = Graphics.FromImage(bitm);

— Рисуем фон (черный квадрат):

graph.FillRectangle(Brushes.Black, 0, 0, iwidth, iheight);

— И текст:

graph.DrawString(DSt,fnt,Brushes.Lime, new Point(0,2));

7. Осталось сделать из объекта Bitmap объект Icon и отдать его контролу NotifyIcon

— Получаем handle иконки:

IntPtr hIcon = bitm.GetHicon();

— Получаем иконку, и отдаем ее NotifyIcon:

System.Drawing.Icon niicon = System.Drawing.Icon.FromHandle(hIcon);
niTest.Icon = niicon;

— Теперь можно уничтожить иконку, т.к в объекте NotifyIcon будет отдельная копия иконки:

DestroyIcon(niicon.Handle);

ФАНФАРЫ!

Пример на GitHub

Источники

Bitmap.GetHicon()
Create Graphics from an Image Object

One Response to C#, динамическая NotifyIcon, иконка в области уведомления

  1. Pingback: C#, динамическая NotifyIcon с наложением изображения. | Персональный блог Толика Панкова

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *