【发布时间】:2011-05-24 14:55:16
【问题描述】:
System.Windows.Forms.TextRenderer.DrawText 方法根据flags 参数的值呈现带或不带左右填充的格式化文本:
-
TextFormatFlags.NoPadding- 将文本紧密地放入边界框, -
TextFormatFlags.GlyphOverhangPadding- 添加一些左右边距, -
TextFormatFlags.LeftAndRightPadding- 增加了更大的利润。
现在,我的问题是对于给定的设备上下文、字符串、字体等,我如何才能获得DrawText 添加到文本中的确切填充量(左右)? p>
我已经使用 .NET Reflector 深入研究了 .NET 4,发现 TextRenderer 计算“悬垂填充”,即字体高度的 1/6,然后将该值相乘以使用这些系数计算左右边距:
-
TextFormatFlags.GlyphOverhangPadding左 1.0,右 1.5, -
TextFormatFlags.LeftAndRightPadding左 2.0,右 2.5。
结果值向上取整并传递给DrawTextExA 或DrawTextExW 原生API 函数。很难重新创建这个过程,因为字体的高度不是来自System.Drawing.Font,而是来自System.Windows.Forms.Internal.WindowsFont,并且这些类为相同的字体返回不同的值。并且涉及到来自 System.Windows.Forms.Internal 命名空间的许多其他内部 BCL 类。反编译所有这些并在我的应用程序中重用它们的代码不是一种选择,因为这将是一个严重的 .NET 实现依赖项。这就是为什么我需要知道 WinForms 中是否有一些公共 API,或者至少我可以使用哪些 Windows 函数来获取左右边距的值。
注意:我尝试TextRenderer.MeasureText 使用和不使用填充并比较结果,但这只给了我左右边距的总和,我需要单独使用它们。
注意 2: 如果您想知道我为什么需要这个:我想用多种字体/颜色绘制一个字符串。这涉及使用NoPadding 选项为每个统一格式的子字符串调用一次DrawText(以便文本不会传播),但我还想在整个多的开头和结尾手动添加普通GlyphOverhangPadding格式化文本。
【问题讨论】:
-
+1 用于综合分析 :-)。我也遇到了这个问题,你嗅到的左填充值为我解决了这个问题 - 谢谢。