2016-04-02 8 views
7

Sto tentando di visualizzare 2-3 caratteri aggiornabili nella barra delle applicazioni anziché visualizzare un file .ico, simile a ciò che fa CoreTemp quando visualizzano la temperatura nel sistema, prova:Scrittura di testo sulla barra delle applicazioni invece di un'icona

enter image description here

sto usando un NotifyIcon nella mia applicazione WinForms insieme con il seguente codice:

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

Purtroppo questo produce un povero nulla di risultato come quello che CoreTemp ottiene:

0.123.516,41 mila

enter image description here

Si potrebbe pensare che la soluzione sarebbe quella di aumentare la dimensione del carattere, ma qualcosa di più di dimensioni 8 non si adatta all'interno dell'immagine. Aumentare la bitmap da 16x16 a 32x32 non fa nulla - viene ridimensionato.

Poi c'è il problema di me che voglio visualizzare "8.55" anziché solo "55" - c'è abbastanza spazio attorno all'icona ma sembra inutilizzabile.

enter image description here

Esiste un modo migliore per fare questo? Perché Windows può fare quanto segue ma non posso?

enter image description here

Aggiornamento:

Grazie per @NineBerry per una buona soluzione. Per aggiungere, trovo che Tahoma sia il miglior font da usare.

+1

Mi aspetterei che altre applicazioni basta usare un set di icone in-built, piuttosto che cercare di generarle on-the-fly –

risposta

9

questo mi dà una discreta visualizzazione alla ricerca di una stringa di due cifre:

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

Cosa ho cambiato:

  1. Utilizzare una dimensione di carattere più grande, ma spostare il x e y spostati ulteriormente a sinistra e in alto (-4, -2).

  2. Impostare TextRenderingHint sull'oggetto Graphics per disabilitare l'anti-aliasing.

Sembra impossibile disegnare più di 2 cifre o caratteri. Le icone hanno un formato quadrato. Qualsiasi testo più lungo di due caratteri significherebbe ridurre l'altezza del testo molto.

L'esempio in cui si seleziona il layout della tastiera (ENG) non è in realtà un'icona di notifica nell'area del vassoio ma la barra degli strumenti della shell stessa.


Il meglio che ho potuto ottenere per visualizzare 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); 
} 

con le seguenti modifiche:

  1. Uso Trebuchet MS che è una fonte molto stretta.
  2. Utilizzare la virgoletta singola anziché il punto perché ha meno spazio ai lati.
  3. Utilizzare la dimensione carattere 10 e adattare adeguatamente gli offset.
+0

Grande risposta, grazie mille – MSOACC

+1

Inoltre, solo per dire che trovo "Tahoma" essere il miglior font da usare qui. – MSOACC

Problemi correlati