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-di