Толик Панков
hex_laden
............ .................. ................
November 2020
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

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/

From:
Identity URL: 
имя пользователя:    
Вы должны предварительно войти в LiveJournal.com
 
E-mail для ответов: 
Вы сможете оставлять комментарии, даже если не введете e-mail.
Но вы не сможете получать уведомления об ответах на ваши комментарии!
Внимание: на указанный адрес будет выслано подтверждение.
Username:
Password:
Subject:
No HTML allowed in subject
Message:



Notice! This user has turned on the option that logs IP addresses of anonymous posters.