2013-01-15 47 views
1

我正在嘗試使用Graphics.DrawStringTextRenderer.DrawText來繪製一些文本。我使用符號字體但輸出不相同 - TextRenderer不處理符號「小於或等於」,「大於或等於」和「不等於」(字節值0xA3,0xB30xB9) - 它畫框而不是它們。其他特殊的符號繪製正確,但 - 例如「平方根」(0xD6).我用這兩種方法相同的字體。我能做些什麼來使TextRenderer正確繪製這些符號?TextRenderer不繪製一些符號字符

編輯:

我運行.NET 4,Windows 7旗艦版與捷克的語言版本(但我的英語版本測試,它看起來是一樣的)。

下面是我的測試應用程序的代碼:

private void panelDrawString_Paint(object sender, PaintEventArgs e) 
{ 
    byte[] array = new byte[] { 0xA3, 0xB3, 0xB9, 0xA4, 0xD6, 0xB4, 0xB0 }; 
    string s = new string(array.Select(b => (char) b).ToArray()); 

    using(StringFormat sf = StringFormat.GenericDefault) 
    using(Font font = new Font("Symbol", 14, FontStyle.Regular)) 
    { 
     sf.Alignment = StringAlignment.Center; 
     sf.LineAlignment = StringAlignment.Center; 

     e.Graphics.DrawString(s, font, SystemBrushes.WindowText, panelDrawString.ClientRectangle, sf); 
    } 
} 

private void panelTextRenderer_Paint(object sender, PaintEventArgs e) 
{ 
    byte[] array = new byte[] { 0xA3, 0xB3, 0xB9, 0xA4, 0xD6, 0xB4, 0xB0 }; 
    string s = new string(array.Select(b => (char) b).ToArray()); 

    using(Font font = new Font("Symbol", 14, FontStyle.Regular)) 
    { 
     TextRenderer.DrawText(e.Graphics, s, font, panelTextRenderer.ClientRectangle, panelTextRenderer.ForeColor); 
    } 
} 

這是輸出:

The output of the code above

+0

工作正常,當我嘗試它。通過記錄.NET版本和Windows版本併發布代碼片段來改善您的問題。 –

+0

是的..它工作得很好..你有沒有使用這些字節,而渲染或複製粘貼從其他地方的符號? –

回答

0

可能有點晚在發佈回覆。

正如this link所述,GdiCharSet是您的問題的原因。 Microsft承認它並不支持所有平臺的所有版本。

字體由字形(如平方根的'√')和代碼頁(如平方根的基數的0xD6)組成。矩形字形是針對任何未知的代碼頁值繪製的。

但是,在您的情況下,TextRenderer和DrawString使用的代碼頁值與您認爲使用的代碼頁值不同。

您創建的保存字符的字符串也會將代碼頁轉換爲UFT16。 這意味着將值0xA3轉換爲0x2264時,該值被轉換爲char值並放入字符串中。

DrawText和DrawString都使用不同的方法來打印字形。 DrawString打印您的預期結果,因爲它將指定值'LESS-THAN OR EQUAL TO'轉換爲字形。然而DrawText打印屬於0x2264的字形。

爲了您的目的,您應該只使用DrawString。