2010-04-08 16 views
6

我有一個c#應用程序可以進行文本渲染,與簡單的wysiwyg文本編輯器相媲美。TextRenderer.DrawText在XP和Vista上呈現Arial不同

我使用TextRenderer.DrawText將文本呈現到屏幕上,並使用GetTextExtentPoint32來測量文本,以便我可以在同一行上定位不同的字體樣式/大小。

在Vista中,這一切正常。然而在XP中,Arial的渲染方式不同,像'o'和'b'這樣的某些字符佔用了比Vista更多的寬度。 GetTextExtentPoint32似乎是測量字符串,因爲它會在Vista中,但寬度較小。最終的結果是,每隔一段時間,一段文本會重疊前一段文本,因爲前一段文本的測量值小於實際在屏幕上的值。

另外,我的文本渲染代碼模仿ie的文本渲染(僅適用於簡單的格式和英文語言),即文本渲染似乎在Vista和XP之間保持一致 - 這就是我注意到不同字符大小的變化。

任何人對發生了什麼有什麼想法?

簡而言之,TextRenderer.DrawText和GetTextExtentPoint32在xp for Arial中不匹配。 DrawText似乎會畫出比Vista更大和/或更小的特定字符,但GetTextExtentPoint32似乎像在Vista中那樣測量文本(這似乎與xp和vista中的文本渲染匹配)。希望這是有道理的。

注意:不幸的是TextRenderer.MeasureString不夠快也不夠準確,無法滿足我的要求。我嘗試過使用它,不得不撕掉它。

+0

+1因爲我知道你在處理什麼!我只需要處理固定寬度的字體。 – leppie 2010-04-08 06:28:51

+0

您確定它不是DPI或Cleartype類問題? – 2010-04-08 08:30:36

回答

0

我不是C#的人,但我相信.NET渲染是建立在GDI +之上的。我也非常確定GDI +自己的字體渲染使用了不受限制的縮放。

GetTextExtentPoint32另一方面是GDI的一部分。 GDI使用大小提示,這可能會影響字符的寬度,具體取決於字體大小。一般來說,小尺寸的GDI文本看起來有點吸氣,但它不會線性縮放。

您必須始終如一地使用一個模型或其他模型才能獲得像素完美的結果。

可能還有其他一些因素可能會使XP在XP上比在Vista上更明顯,但兩者都存在根本問題。這些其他因素可能包括DPI設置,DPI縮放,ClearType或反鋸齒設置,字體鏈接(如果您要混合來自其他字母的腳本),字體替換(尤其是在打印中),甚至可能包含不同版本的Arial。我甚至不確定GDI +使用與GDI相同的默認映射模式。

另見my answer on print preview

2

感謝您花時間回覆阿德里安。

我的理解是,TextRenderer.DrawText實際上包裝了一個調用GDI,完全繞過了GDI +文本渲染。這就是爲什麼我對GetTextExtentPoint32不和輸出混淆的原因。

我想我發現了這個問題。事實證明,如果將Graphics.TextRenderingHint設置爲System.Drawing.Text.TextRenderingHint.ClearTypeGridFit或其他值,則會導致某些字體中的某些字符的大小增大或減小。這在XP中比在Vista中似乎更真實。在Vista中我根本沒有看到它。無論如何,它看起來像GetTextExtentPoint32要麼不能識別差異,要麼在我打電話時不設置某種標誌。

我的解決方案是隻使用系統默認的textrenderinghint設置。

+0

看起來不錯。我在這裏找到了一些很好的信息(但他也提出了一些可疑的聲明,所以請小心)。 http://blogs.msdn.com/cjacks/archive/2006/05/11/595525.aspx – 2010-04-09 16:48:30

0

其實TextRenderer的DrawText和MeasureString基於DrawTextEx(這是User32,而不是Gdi函數)。 因此,您可以考慮使用本機編組調用此函數而不是MeauseString,因爲它會執行一些額外的計算(特別是如果您使用沒有HDC的函數覆蓋)。

也可能這個post也會對你有所幫助。

相關問題