// процедура генерации иконки public Icon GeneratedIcon(DSServerStatus stat) { //создаем битмапку 16х16 Bitmap bmp = new Bitmap(16, 16); //задаем шрифт и его размеры Font font = new Font("MS Sans Serif", 8, FontStyle.Regular); //создаем объект класса для рисования "из картинки" Graphics graphics = Graphics.FromImage(bmp); graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.SingleBitPerPixelGridFit; //создаем кисть для прозрачного фона SolidBrush whiteBrush = new SolidBrush(Color.FromArgb(0, 1, 1, 1)); // кисть текста SolidBrush txtBrush; // строка текста для трея string txt = ""; txtBrush = new SolidBrush(Color.Blue); switch (stat) { case DSServerStatus.NORMAL: // кистью будем писать буквы txtBrush = new SolidBrush(Color.Blue); //создаем кисть для прозрачного фона whiteBrush = new SolidBrush(Color.FromArgb(0, 1, 1, 1)); txt = "N"; break; case DSServerStatus.SERVER_STOPPED: // кистью будем писать буквы txtBrush = new SolidBrush(Color.Blue); //создаем кисть для прозрачного фона whiteBrush = new SolidBrush(Color.FromArgb(0, 1, 1, 1)); txt = "‖"; break; case DSServerStatus.NO_COMMUNICATION_CONTROLLER: case DSServerStatus.TEMP_DEVICE1_ERROR: case DSServerStatus.TEMP_DEVICE2_ERROR: case DSServerStatus.TEMP_DEVICES_ERROR: // кистью будем писать буквы txtBrush = new SolidBrush(Color.White); //создаем кисть для прозрачного фона whiteBrush = new SolidBrush(Color.FromArgb(255, 0, 0)); txt = "E"; break; } //создаем прямоугольник 16х16 с начальными координатами (0,0) RectangleF canvas = new Rectangle(0, 0, 16, 16); Pen pn = new Pen(txtBrush.Color); Rectangle rct = new Rectangle(1, 1, 14, 14); graphics.DrawRectangle(pn, rct); //закрашиваем его "фоновой" кистью graphics.FillRectangle(whiteBrush, canvas); // Set format of string. StringFormat drawFormat = new StringFormat(); drawFormat.Alignment = StringAlignment.Center; drawFormat.LineAlignment = StringAlignment.Center; //пишем в нем заданную букву красной кистью graphics.DrawString(txt, font, txtBrush, canvas, drawFormat); //пишем в нем заданную букву // graphics.DrawString(txt, font, txtBrush, new PointF(0, 2)); //преобразуем картинку bmp в иконку return Icon.FromHandle(bmp.GetHicon()); }
// процедура изменения статуса public void ChangeStatus(DSServerStatus newStatus) { curStatus = newStatus; switch (curStatus) { case DSServerStatus.NORMAL: trayIcon.Text = "Норма"; break; case DSServerStatus.NO_COMMUNICATION_CONTROLLER: trayIcon.Text = "Нет связи с контроллером"; break; case DSServerStatus.TEMP_DEVICE1_ERROR: trayIcon.Text = "Ошибка датчика температуры 1"; break; case DSServerStatus.TEMP_DEVICE2_ERROR: trayIcon.Text = "Ошибка датчика температуры 2"; break; case DSServerStatus.TEMP_DEVICES_ERROR: trayIcon.Text = "Ошибка обоих датчиков температуры"; break; case DSServerStatus.SERVER_STOPPED: trayIcon.Text = "Сервер остановлен \r\n (COM порт освобожден)"; break; } statuslStatus.Text = trayIcon.Text; trayIcon.Icon = GeneratedIcon(curStatus); }