Вы должны войти, чтобы создавать сообщения и темы.

Ошибка общего вида [Решено]

Здравствуйте, подскажите пожалуйста как исправить ошибку, либо может есть другой вариант как вывести текст поверх иконки в трее.

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);
}

 

Добрый день.
В одном из своих проектов использовал такую функцию:

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-надцать лет назад и что там для чего нужно и как работает не помню.

Скажите а СкопированоDestroyIcon это название иконки?

Цитата: Илья от 13.05.2021, 15:34

Скажите а СкопированоDestroyIcon это название иконки?

Нет, API функция. Забыл за нее:

[DllImport("user32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
        private static extern bool DestroyIcon(IntPtr handle);

Без нее были какие-то проблемы или ошибки с обновлением иконки вроде, но точно не помню.

Спасибо большое щас попробую.

Надпись выводится не поверх готовой иконки, а в цветном квадрате. У меня использовалось, чтобы в зависимости от условия менялись цвета:

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 f, Brush b ?

Цвет фона (b) и цвет текста (f), вроде.

Туплю не могу понять как вписать СкопированоBrush f Brush b ))

Все разобрался)

Ну так пример выше же есть.
Можно их объявить, если нужно что-то менять при каком то условии, либо просто вписать:
СкопированоDrawTrayString(/*какой-то string*/, Brushes.Yellow, Brushes.Black);

Прошу прощения, затупил.
Я так понял лучше если что-то подобное делать, то делать через Winapi.

Спасибо большое, ошибка исчезла, вопрос решен.))