System.Windows.Forms.TextRenderer.DrawText
方法渲染格式的文本有或無左右邊距取決於flags
參數的值:如何獲得使用的確切文字利潤率由TextRenderer
TextFormatFlags.NoPadding
- 緊密適合文本邊框,TextFormatFlags.GlyphOverhangPadding
- 增加了一些左右邊距,TextFormatFlags.LeftAndRightPadding
- 增加了更大的利潤。
現在,我的問題是我怎樣才能得到填充的確切數額(左,右)DrawText
添加到文本對於給定的設備上下文,字符串,字體等?
我用.NET Reflector挖掘了.NET 4,發現TextRenderer計算字體高度的1/6的「懸垂填充」,然後乘以該值以計算使用這些係數的左右邊距:
- 左1.0,對於
TextFormatFlags.GlyphOverhangPadding
右1.5, - 左2.0,右2.5
TextFormatFlags.LeftAndRightPadding
。
將得到的值向上取整並傳遞給DrawTextExA
或DrawTextExW
本機API函數。重新創建此過程很困難,因爲字體的高度不是從System.Drawing.Font
而是從System.Windows.Forms.Internal.WindowsFont
中獲取的,並且這些類爲同一字體返回不同的值。涉及到System.Windows.Forms.Internal
命名空間中的許多其他內部BCL類。反編譯它們並在應用程序中重用它們的代碼不是一種選擇,因爲這將是一個嚴重的.NET實現依賴。這就是爲什麼我需要知道WinForms中是否有一些公共API,或者至少可以使用哪些Windows函數來獲取左右邊距的值。
注:我試圖TextRenderer.MeasureText
有和沒有填充,並比較結果,但是這給了我唯一的左,右頁邊距的總和與我分別需要他們。
注2:如果你想知道爲什麼我需要這樣的:我要畫一個字符串與多種字體/顏色。這涉及調用DrawText
一次爲每個統一格式的子字符串與NoPadding
選項(以便文本不傳播),但我也想手動添加正常GlyphOverhangPadding
在整個多格式文本的開頭和結尾。
+1爲綜合分析:-)。我也有這個問題,你嗅過的左邊填充值爲我解決了 - 謝謝。 – Fedearne 2011-07-07 08:29:39