簡體   English   中英

TextRenderer.DrawText在XP vs Vista上呈現不同的Arial

[英]TextRenderer.DrawText renders Arial differently on XP vs Vista

我有一個ac#應用程序,它可以進行文本渲染,與簡單的所見即所得文本編輯器相同。

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

在Vista這一切都很好。 然而,在XP中,Arial渲染方式不同,某些字符(如“o”和“b”)占用的寬度比Vista中的寬。 GetTextExtentPoint32似乎是在Vista中測量字符串,但寬度較小。 最終結果是,每隔一段時間就會出現一段文本與之前的文本重疊,因為前面的文本被測量為小於它在屏幕上的實際值。

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

有什么想法發生了什么?

簡而言之,TextRenderer.DrawText和GetTextExtentPoint32在xp中與Arial不匹配。 DrawText似乎繪制了比Vista中更大和/或更小的某些字符,但GetTextExtentPoint32似乎是在Vista中測量文本(它似乎與文本渲染相匹配,即在xp和vista上)。 希望有道理。

注意:遺憾的是TextRenderer.MeasureString不夠快或不夠准確,無法滿足我的要求。 我嘗試使用它,不得不把它撕掉。

感謝您抽出寶貴時間回應阿德里安。

我的理解是TextRenderer.DrawText實際上包含了對GDI的調用,完全繞過了GDI +文本渲染。 這就是為什么我對GetTextExtentPoint32不滿足輸出感到困惑的原因。

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

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

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

也許這篇文章對你也有幫助。

我不是C#家伙,但我相信.NET渲染是建立在GDI +之上的。 我也很確定GDI +使用自己的字體渲染,使用不帶顏色的縮放。

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

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

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

另請參閱打印預覽的答案

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM