System.Windows.Forms.TextRenderer.DrawText
方法根据flags
参数的值呈现格式化文本,可以带有左右填充或不带有:
TextFormatFlags.NoPadding
- 将文本紧密地适配到边界框中,TextFormatFlags.GlyphOverhangPadding
- 添加一些左右边距,TextFormatFlags.LeftAndRightPadding
- 添加更大的左右边距。
现在,我的问题是如何获取给定设备上下文、字符串、字体等添加到文本中的精确填充量(左右)?
我使用 .NET Reflector 深入挖掘了 .NET 4,并发现 TextRenderer 计算了 "overhang padding",该值为字体高度的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
获取的,并且这些类为相同的字体返回不同的值。还涉及许多其他内部 BCL 类,来自System.Windows.Forms.Internal
命名空间。反编译所有这些类并在应用程序中重新使用它们的代码不是一个选项,因为那将是一个严重的 .NET 实现依赖关系。这就是为什么我需要知道是否有一些公共 API 在 WinForms 中,或者至少可以使用哪些 Windows 函数来获取左右边距的值。
注意: 我已经尝试使用TextRenderer.MeasureText
进行测量,包括带有和不带有填充的情况,并比较了结果,但是这仅给出了左右边距之和,而我需要它们分别。
注意2: 如果你想知道为什么我需要这个:我想用多种字体/颜色绘制一个字符串。这涉及到对均匀格式的子字符串每次调用DrawText
选项为NoPadding
(以使文本不扩展),但我还想在整个多格式文本的开头和结尾手动添加普通的GlyphOverhangPadding
。