Ошибка общего вида [Решено]
Цитата: Илья от 13.05.2021, 14:38Здравствуйте, подскажите пожалуйста как исправить ошибку, либо может есть другой вариант как вывести текст поверх иконки в трее.
void DrawTrayString(string str, Font font, Color foreColor) { Bitmap bmp = new Bitmap(16, 16); using (Graphics g = Graphics.FromImage(bmp)) { g.DrawString(str, font, new SolidBrush(foreColor), -2, 0); } notifyIcon1.Icon = Icon.FromHandle(bmp.GetHicon()); } void Timer2_Tick(object sender, EventArgs e) { NativeMethods MemoryInfo = new NativeMethods(); DrawTrayString(MemoryInfo.MemoryLoad.ToString(), new Font("Arial", 10), Color.White); }
Здравствуйте, подскажите пожалуйста как исправить ошибку, либо может есть другой вариант как вывести текст поверх иконки в трее.
void DrawTrayString(string str, Font font, Color foreColor)
{
Bitmap bmp = new Bitmap(16, 16);
using (Graphics g = Graphics.FromImage(bmp)) { g.DrawString(str, font, new SolidBrush(foreColor), -2, 0); }
notifyIcon1.Icon = Icon.FromHandle(bmp.GetHicon());
}
void Timer2_Tick(object sender, EventArgs e)
{
NativeMethods MemoryInfo = new NativeMethods();
DrawTrayString(MemoryInfo.MemoryLoad.ToString(), new Font("Arial", 10), Color.White);
}
Цитата: Adler от 13.05.2021, 15:28Добрый день.
В одном из своих проектов использовал такую функцию:private void DrawTrayString(string str, Brush f, Brush b) { var font = new Font(FontFamily.GenericMonospace, 10, FontStyle.Bold, GraphicsUnit.Point); var iwidth = 16; var iheight = 16; var bitm = new Bitmap(iwidth, iheight); var graph = Graphics.FromImage(bitm); graph.FillRectangle(b, 0, 0, iwidth, iheight); graph.DrawString(str, font, f, new Point(2, 0)); var hIcon = bitm.GetHicon(); var niicon = System.Drawing.Icon.FromHandle(hIcon); notifyIcon1.Icon = niicon; DestroyIcon(niicon.Handle); }P.S. Эту функцию откуда-то скопипастил n-надцать лет назад и что там для чего нужно и как работает не помню.
Добрый день.
В одном из своих проектов использовал такую функцию:
private void DrawTrayString(string str, Brush f, Brush b)
{
var font = new Font(FontFamily.GenericMonospace, 10, FontStyle.Bold, GraphicsUnit.Point);
var iwidth = 16; var iheight = 16;
var bitm = new Bitmap(iwidth, iheight);
var graph = Graphics.FromImage(bitm);
graph.FillRectangle(b, 0, 0, iwidth, iheight);
graph.DrawString(str, font, f, new Point(2, 0));
var hIcon = bitm.GetHicon();
var niicon = System.Drawing.Icon.FromHandle(hIcon);
notifyIcon1.Icon = niicon;
DestroyIcon(niicon.Handle);
}
P.S. Эту функцию откуда-то скопипастил n-надцать лет назад и что там для чего нужно и как работает не помню.
Цитата: Илья от 13.05.2021, 15:34Скажите а
DestroyIconэто название иконки?
Скажите а СкопированоDestroyIcon это название иконки?
Цитата: Adler от 13.05.2021, 15:38Цитата: Илья от 13.05.2021, 15:34Скажите а
DestroyIconэто название иконки?Нет, API функция. Забыл за нее:
[DllImport("user32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)] private static extern bool DestroyIcon(IntPtr handle);Без нее были какие-то проблемы или ошибки с обновлением иконки вроде, но точно не помню.
Цитата: Илья от 13.05.2021, 15:34Скажите а
СкопированоDestroyIconэто название иконки?
Нет, API функция. Забыл за нее:
[DllImport("user32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
private static extern bool DestroyIcon(IntPtr handle);
Без нее были какие-то проблемы или ошибки с обновлением иконки вроде, но точно не помню.
Цитата: Илья от 13.05.2021, 15:40Спасибо большое щас попробую.
Спасибо большое щас попробую.
Цитата: Adler от 13.05.2021, 15:46Надпись выводится не поверх готовой иконки, а в цветном квадрате. У меня использовалось, чтобы в зависимости от условия менялись цвета:
Brush b; Brush f; if (!check()) b = Brushes.Red; else b = Brushes.Black; if (count == 0) { b = Brushes.Red; f = Brushes.White; } else f = Brushes.Yellow; DrawTrayString(count.ToString(), f, b);Само собой
check()иcountфункция и переменная в самой программе. Просто как пример привел...
Надпись выводится не поверх готовой иконки, а в цветном квадрате. У меня использовалось, чтобы в зависимости от условия менялись цвета:
Brush b; Brush f;
if (!check()) b = Brushes.Red;
else b = Brushes.Black;
if (count == 0)
{
b = Brushes.Red;
f = Brushes.White;
}
else f = Brushes.Yellow;
DrawTrayString(count.ToString(), f, b);
Само собой Скопированоcheck() и Скопированоcount функция и переменная в самой программе. Просто как пример привел...
Цитата: Илья от 13.05.2021, 15:46Скажите а это отвечает за цвет
Brush f, Brush b?
Скажите а это отвечает за цветСкопировано Brush f, Brush b ?
Цитата: Adler от 13.05.2021, 15:54Цвет фона (b) и цвет текста (f), вроде.
Цвет фона (b) и цвет текста (f), вроде.
Цитата: Илья от 13.05.2021, 15:54Туплю не могу понять как вписать
Brush f Brush b))
Туплю не могу понять как вписать СкопированоBrush f Brush b ))
Цитата: Илья от 13.05.2021, 15:56Все разобрался)
Все разобрался)
Цитата: Adler от 13.05.2021, 15:57Ну так пример выше же есть.
Можно их объявить, если нужно что-то менять при каком то условии, либо просто вписать:
DrawTrayString(/*какой-то string*/, Brushes.Yellow, Brushes.Black);
Ну так пример выше же есть.
Можно их объявить, если нужно что-то менять при каком то условии, либо просто вписать:
СкопированоDrawTrayString(/*какой-то string*/, Brushes.Yellow, Brushes.Black);
Цитата: Илья от 13.05.2021, 16:00Прошу прощения, затупил.
Я так понял лучше если что-то подобное делать, то делать через Winapi.
Прошу прощения, затупил.
Я так понял лучше если что-то подобное делать, то делать через Winapi.
Цитата: Илья от 13.05.2021, 17:49Спасибо большое, ошибка исчезла, вопрос решен.))
Спасибо большое, ошибка исчезла, вопрос решен.))