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