Толик Панков
hex_laden
............ .................. ................

October 2025
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

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

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



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

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

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

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

Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2018/05/17/c-dinamicheskaya-notifyicon-ikonka-v-oblasti-uvedomleniya/

Tags: ,
Comments
(Anonymous)

Молодец. Будем тебя кормить вместо бесплодного кетмара-линуксоида.

Кормите лучше Кетмара, меня пока рептилоиды кормят

(Anonymous)

график загрузки ЦП

И какие у вас претензии к Центральному Прцессору? Немедленно выкиньте его, и покиньте Интернет!