1

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

问题是 TextRenderer 不能正确打印西方字符(韩文、日文等)

这是一个显示该问题的示例:

在此处输入图像描述

  • 你知道为什么在使用 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)

在此处输入图像描述

所以现在我的问题是:

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

1 回答 1

1

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

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

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

这意味着使用与调用线程关联的当前语言。[1]

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

于 2013-05-08T17:47:12.863 回答