2012-03-15 189 views
1

我试图将我的Graphics.DrawString调用(.NET1)迁移到TextRenderer.DrawText(.NET 2.0中的新增功能)以获得ClearType渲染的优势。Graphics.DrawString vs TextRenderer.DrawText绘制韩文字符

的问题是,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; 
    } 

编辑:使用其他字体是否能够正常工作(使用的字体清黑体)

enter image description here

所以现在我的问题是:

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

看到矩形意味着您使用的字体不支持字形。奇怪的问题,在Vista +上,特别是因为你似乎至少有一个支持他们的字体。无法从截图反向工程代码。 – 2012-03-15 16:58:36

+0

@HansPassant:这两种情况的字体是一样的,所以我不确定是否有字体问题。 – 2012-03-15 17:21:17

+0

和汉斯一样,我不相信只是因为一个函数正确显示字体,这意味着另一个函数也应该。为什么不通过你的机器上的字体,看看有什么影响? – 2012-03-15 17:46:37

回答

1

事实是,一个来自于它们知道一个Unicode范围不支持的字符(在你的情况下为他们的缺省Unicode字体编辑器改变字体,CJK统一定义,这可能要求宋体的Unicode三世MS或MS-明乔)。同时,使用某种字体强制渲染不允许使用此字体切换。

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

因此,对于你的其他问题,为什么DrawString成功做Draw​​Text无法做到的字体切换。秘密在于您设置的StringFormat.GenericTypographic标志。 GenericTypographics默认包含设置为中性语言的语言ID,

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

由于您使用的是日韩输入字符串,可能是你调用线程知道设置为CJK语言设置语言,然后确保您的显示器有它的通用Unicode字体切换显示正确的符号。