【问题标题】:Graphics.DrawString vs TextRenderer.DrawText drawing korean charactersGraphics.DrawString 与 TextRenderer.DrawText 绘制韩文字符
【发布时间】:2012-03-15 16:55:04
【问题描述】:

我正在尝试将我的 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 编辑器可以显示韩文字符,而文本框却不能呢?

【问题讨论】:

  • 看到矩形意味着您使用的字体不支持字形。在 Vista+ 上遇到的奇怪问题,特别是因为您似乎至少有一种支持它们的字体。无法从屏幕截图中对代码进行逆向工程。
  • @HansPassant:这两种情况的字体是一样的,所以我不确定是不是字体问题。
  • 和 Hans 一样,我不相信仅仅因为一个函数正确显示字体就意味着另一个函数也应该如此。为什么不检查你机器上的字体,看看有什么影响?
  • 你是对的,它是字体,但我不明白为什么 Visual Studio 可以使用 Consolas 绘制韩文,而我的文本框不能

标签: c# .net winforms text drawtext


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-04
    • 1970-01-01
    • 2012-10-11
    • 2012-06-26
    • 2015-03-01
    • 1970-01-01
    相关资源
    最近更新 更多