2016-04-02 4 views
7

Я пытаюсь отобразить на панели задач 2-3 обновляемых символа, а не отображать файл .ico, аналогичный тому, что делает CoreTemp при отображении температуры в системе:Написание текста в системный лоток вместо значка

enter image description here

Я использую NotifyIcon в моем приложении WinForms вместе со следующим кодом:

Font fontToUse = new Font("Microsoft Sans Serif", 8, FontStyle.Regular, GraphicsUnit.Pixel); 
Brush brushToUse = new SolidBrush(Color.White); 
Bitmap bitmapText = new Bitmap(16, 16); 
Graphics g = Drawing.Graphics.FromImage(bitmapText); 

IntPtr hIcon; 
public void CreateTextIcon(string str) 
{ 
    g.Clear(Color.Transparent); 
    g.DrawString(str, fontToUse, brushToUse, -2, 5); 
    hIcon = (bitmapText.GetHicon); 
    NotifyIcon1.Icon = Drawing.Icon.FromHandle(hIcon); 
    DestroyIcon(hIcon.ToInt32); 
} 

к сожалению, это не производит плохой результат ничего подобного, что получает CoreTemp:

enter image description here

Можно подумать, что решение было бы увеличить размер шрифта, но ничего более размера 8 не помещается внутри изображения. Увеличение растрового изображения с 16x16 до 32x32 ничего не делает - оно уменьшается.

Тогда возникает проблема, когда я хочу отображать «8.55» вместо «55» - достаточно места вокруг значка, но оно кажется непригодным.

enter image description here

Есть ли лучший способ сделать это? Почему окна могут делать следующее, но я не могу?

enter image description here

Update:

Спасибо за @NineBerry для хорошего решения. Чтобы добавить, я считаю Tahoma лучшим шрифтом для использования.

+1

Я хотел бы ожидать, что другие приложения просто использовать набор в построенных иконок, а не пытаться создавать их на лету –

ответ

9

Это дает мне достаточно хорошо выглядящий дисплей два значного ряда:

enter image description here

private void button1_Click(object sender, EventArgs e) 
{ 
    CreateTextIcon("89"); 
} 

public void CreateTextIcon(string str) 
{ 
    Font fontToUse = new Font("Microsoft Sans Serif", 16, FontStyle.Regular, GraphicsUnit.Pixel); 
    Brush brushToUse = new SolidBrush(Color.White); 
    Bitmap bitmapText = new Bitmap(16, 16); 
    Graphics g = System.Drawing.Graphics.FromImage(bitmapText); 

    IntPtr hIcon; 

    g.Clear(Color.Transparent); 
    g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.SingleBitPerPixelGridFit; 
    g.DrawString(str, fontToUse, brushToUse, -4, -2); 
    hIcon = (bitmapText.GetHicon()); 
    notifyIcon1.Icon = System.Drawing.Icon.FromHandle(hIcon); 
    //DestroyIcon(hIcon.ToInt32); 
} 

Что изменилось:

  1. использовать больший размер шрифта, но переместить x и y смещены дальше влево и вверху (-4, -2).

  2. Set TextRenderingHint на объекте Graphics, чтобы отключить сглаживание.

Кажется невозможным нарисовать более двух цифр или символов. Значки имеют квадратный формат. Любой текст длиной более двух символов означает значительное уменьшение высоты текста.

Образец, в котором вы выбрали раскладку клавиатуры (ENG), на самом деле не является значком уведомления в области лотка, а его собственной панелью инструментов оболочки.


Лучшее, что я смог достичь для отображения 8.55:

enter image description here

private void button1_Click(object sender, EventArgs e) 
{ 
    CreateTextIcon("8'55"); 
} 

public void CreateTextIcon(string str) 
{ 
    Font fontToUse = new Font("Trebuchet MS", 10, FontStyle.Regular, GraphicsUnit.Pixel); 
    Brush brushToUse = new SolidBrush(Color.White); 
    Bitmap bitmapText = new Bitmap(16, 16); 
    Graphics g = System.Drawing.Graphics.FromImage(bitmapText); 

    IntPtr hIcon; 

    g.Clear(Color.Transparent); 
    g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.SingleBitPerPixelGridFit; 
    g.DrawString(str, fontToUse, brushToUse, -2, 0); 
    hIcon = (bitmapText.GetHicon()); 
    notifyIcon1.Icon = System.Drawing.Icon.FromHandle(hIcon); 
    //DestroyIcon(hIcon.ToInt32); 
} 

со следующими изменениями:

  1. Использование Требушет MS, который является очень узким шрифтом.
  2. Используйте одиночную кавычку вместо точки, потому что она имеет меньше места по бокам.
  3. Используйте размер шрифта 10 и соответствующим образом адаптируйте смещения.
+0

Великий ответ, спасибо очень много – MSOACC

+1

Кроме того, просто сказать, что я считаю «Tahoma» чтобы быть лучшим шрифтом для использования здесь. – MSOACC