我正在尝试使用Graphics.DrawString
和TextRenderer.DrawText
绘制一些文字。我使用 Symbol 字体,但输出不相同 - TextRenderer
不处理符号“小于或等于”,“大于或等于”和“不等于” to“(字节值0xA3
,0xB3
,0xB9
) - 它会绘制框而不是它们。但是,正确绘制了其他特殊符号 - 例如“square root”(0xD6).
我对这两种方法使用相同的字体。我该怎么做才能使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 );
}
}
这是输出:
答案 0 :(得分:0)
发布回复可能有点晚了。
如this link中所述,GdiCharSet是导致问题的原因。 Microsft承认它不支持所有平台的所有版本。
字体由字形组成(如平方根的基数为'√')和代码页(如方根的基数为0xD6)。对于任何未知的代码页值,都会绘制矩形字形。
在您的情况下,TextRenderer和DrawString使用的代码页值与您认为使用的代码页值不同。
您创建的包含字符的字符串也会将代码页转换为UFT16。 这意味着当值被类型化为char值并放置在字符串中时,值0xA3将转换为0x2264。
DrawText和DrawString都使用不同的方法来打印字形。 DrawString打印您的预期结果,因为它将命名值'LESS-THAN OR EQUAL TO'转换为字形。但是,DrawText会打印属于0x2264的字形。
为了您的目的,您应该只使用DrawString。