TextRenderer不会绘制一些符号字符

时间:2013-01-15 09:24:36

标签: c# drawtext text-rendering

我正在尝试使用Graphics.DrawStringTextRenderer.DrawText绘制一些文字。我使用 Symbol 字体,但输出不相同 - TextRenderer不处理符号“小于或等于”,“大于或等于”和“不等于” to“(字节值0xA30xB30xB9) - 它会绘制框而不是它们。但是,正确绘制了其他特殊符号 - 例如“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 );
    }
}

这是输出:

The output of the code above

1 个答案:

答案 0 :(得分:0)

发布回复可能有点晚了。

this link中所述,GdiCharSet是导致问题的原因。 Microsft承认它不支持所有平台的所有版本。

字体由字形组成(如平方根的基数为'√')和代码页(如方根的基数为0xD6)。对于任何未知的代码页值,都会绘制矩形字形。

在您的情况下,TextRenderer和DrawString使用的代码页值与您认为使用的代码页值不同。

您创建的包含字符的字符串也会将代码页转换为UFT16。 这意味着当值被类型化为char值并放置在字符串中时,值0xA3将转换为0x2264

DrawText和DrawString都使用不同的方法来打印字形。 DrawString打印您的预期结果,因为它将命名值'LESS-THAN OR EQUAL TO'转换为字形。但是,DrawText会打印属于0x2264的字形。

为了您的目的,您应该只使用DrawString。