2016-04-02 90 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

更新:

感謝@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. 在Graphics對象上設置TextRenderingHint以禁用消除鋸齒。

看起來不可能畫出兩個以上的數字或字符。圖標有一個方形格式。任何超過兩個字符的文字都意味着文本的高度會減少很多。

您選擇鍵盤佈局(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

另外,只是說,我覺得「宋體」成爲這裏使用的最好的字體。 – MSOACC