1

我正在尝试同时使用Graphics.DrawString和绘制一些文本TextRenderer.DrawText。我使用Symbol字体,但输出不一样 -TextRenderer不处理符号“小于或等于”、“大于或等于”和“不等于”(字节值0xA3、、、0xB30xB9- 它绘制框而不是他们。但是,其他特殊符号被正确绘制 - 例如“平方根”(0xD6).我在两种方法中都使用相同的字体。我该怎么做才能TextRenderer正确绘制这些符号?

编辑:

我正在运行带有捷克语版本的 .NET 4、Windows 7 Ultimate(但我已经用英语版本对其进行了测试,并且看起来相同)。

以下是我的测试应用程序的代码:

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

这是输出:

上面代码的输出

4

1 回答 1

0

发布回复可能有点晚。

如此链接中所述, GdiCharSet 是您的问题的原因。Microsft 承认它不支持每个平台的所有版本。

字体由字形(如平方根的基数的“√”)和代码页(如平方根的基数的 0xD6)组成。矩形字形是为任何未知的代码页值绘制的。

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

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

DrawText 和 DrawString 都使用不同的方法来打印字形。DrawString 打印您的预期结果,因为它将命名值“小于或等于”转换为字形。然而,DrawText 打印属于 0x2264 的字形。

出于您的目的,您应该只使用 DrawString。

于 2013-05-12T17:50:10.097 回答