Graphics.DrawString vs TextRenderer.DrawText绘制韩语字符

时间:2012-03-15 16:55:05

标签: c# .net winforms text drawtext

我正在尝试将Graphics.DrawString调用(.NET1)迁移到TextRenderer.DrawText(.NET 2.0中的新增功能),以获得ClearType渲染的优势。

问题是TextRenderer不能正确打印西方字符(韩国,日本等......)

以下是一个显示问题的示例:

enter image description here

  • 你知道为什么在使用TextRenderer.DrawText时看不到韩国字符吗?
  • 你知道如何解决这个问题吗?

我正在使用以下两种方法绘制字符串:

    private void DrawGraphicsString(
        Graphics g, string text, Font font, Point p)
    {
        g.DrawString(
            text, font, text_brush, p.X, p.Y, mStringFormat);
        // mStringFormat is
        // StringFormat.GenericTypographic | 
        // StringFormatFlags.MeasureTrailingSpaces

    }

    private void DrawTextRendererString(
         Graphics g, string text, Font font, int x, int y)        
    {
        TextRenderer.DrawText(
            g, text, font, p, this.ForeColor, this.BackColor, mTextFormatFlags);

        // mTextFormatFlags are
        // StringFormat.GenericTypographic + StringFormatFlags.MeasureTrailingSpaces
        // mTextFormatFlags = 
        //    TextFormatFlags.NoPrefix |
        //    TextFormatFlags.NoPadding |
        //    TextFormatFlags.WordBreak |
        //    TextFormatFlags.TextBoxControl |
        //    TextFormatFlags.NoClipping |
        //    TextFormatFlags.ExpandTabs;
    }

编辑:使用其他字体,它可以正常工作(使用字体Malgun Gothic)

enter image description here

所以现在我的问题是:

  • 为什么即使字体不支持,Graphics.Drawtext也会绘制韩语字符?
  • 我将corean文本粘贴到Visual Studio编辑器中,该编辑器使用“Consolas”字体并正确绘制。那么,为什么Visual Studio编辑器可以显示韩文字符,而文本框不能显示?

1 个答案:

答案 0 :(得分:1)

事实上,当编辑器在他们知道的Unicode范围内具有不受支持的字符时(在您的情况下,可能需要Arial Unicode Sans MS或MS-Mincho的CJK Unicode定义),编辑器会更改其默认Unicode字体的字体。同时,使用某种字体强制渲染不允许这种字体切换。

这就是为什么你必须在编译之前知道你是否需要Unicode以及在这种情况下你想使用哪种字体。

所以对于你的另一个问题,为什么DrawString成功进行字体切换而DrawText无法做到。秘密在你设置的StringFormat.GenericTypographic标志中。 GenericTypographics默认包含设置为中性语言的语言ID,

  

表示使用与调用线程关联的当前语言。 [1]

由于您使用的是CJK输入字符串,因此您的调用线程可能知道设置为CJK语言集的语言,然后通过使用它的通用unicode字体开关来确保显示器显示正确的符号。