Давно посматривал на всякие приложения типа 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);
ФАНФАРЫ!
Pingback: C#, динамическая NotifyIcon с наложением изображения. | Персональный блог Толика Панкова