2012-03-15 192 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字體切換顯示正確的符號。