小编Jac*_*cki的帖子

如何获取TextRenderer使用的确切文本边距

System.Windows.Forms.TextRenderer.DrawText方法使用或不使用左右填充来呈现带格式的文本,具体取决于flags参数的值:

  • TextFormatFlags.NoPadding - 将文本紧密地放入边框中,
  • TextFormatFlags.GlyphOverhangPadding - 添加一些左右边距,
  • TextFormatFlags.LeftAndRightPadding - 增加更大的利润.

现在,我的问题是如何获得DrawText给定设备上下文,字符串,字体等文本添加的填充(左和右)的确切数量

我使用.NET Reflector挖掘.NET 4,发现TextRenderer计算"悬垂填充",它是字体高度的1/6,然后将此值乘以使用这些系数计算左右边距:

  • 左边1.0,右边1.5 TextFormatFlags.GlyphOverhangPadding,
  • 左2.0,右2.5 TextFormatFlags.LeftAndRightPadding.

生成的值将向上舍入并传递给DrawTextExADrawTextExW本机API函数.重新创建此过程很困难,因为字体的高度不是来自System.Drawing.Font而是来自,System.Windows.Forms.Internal.WindowsFont并且这些类为同一字体返回不同的值.并且System.Windows.Forms.Internal涉及命名空间中的许多其他内部BCL类.反编译所有这些并在我的应用程序中重用它们的代码不是一个选项,因为那将是一个严重的.NET实现依赖.这就是为什么我需要知道WinForms中是否有一些公共API,或者至少我可以使用哪些Windows函数来获取左右边距的值.


注意:我已尝试TextRenderer.MeasureText使用和不使用填充并比较结果,但这只给了我左右边距的总和,我需要它们分开.


注意2:如果你想知道我为什么需要这个:我想绘制一个包含多种字体/颜色的字符串.这涉及DrawText为每个带有NoPadding选项的统一格式化子字符串调用一次(以便文本不会传播)但我还想GlyphOverhangPadding在整个多格式文本的开头和结尾处手动添加正常.

c# gdi winforms

29
推荐指数
2
解决办法
5390
查看次数

标签 统计

c# ×1

gdi ×1

winforms ×1