【发布时间】:2018-04-26 01:39:18
【问题描述】:
我正在尝试使用可变宽度字体创建两列左对齐文本。我目前的流程:
- 测量将进入第一列的字符串
- 从所述第一列的最大宽度中减去其宽度以获得差值
- 将其除以单个空格的宽度以获得所需的空格数
- 用必要数量的空格右填充结果
这在我看来合乎逻辑,但输出看起来像这样(使用可变宽度字体):
a 12345678910
as 12345678910
asd 12345678910
asdf 12345678910
asdfg 12345678910
我正在寻找的输出是这样的:
a 12345678910
as 12345678910
asd 12345678910
asdf 12345678910
asdfg 12345678910
我错过了什么?
const int maxNameWidth = 150;
Font measurementFont;
Graphics graphics;
float spaceWidth;
void Main()
{
measurementFont = new Font("Arial", 14);
graphics = Graphics.FromImage(new Bitmap(1, 1));
spaceWidth = graphics.MeasureString(" ", measurementFont).Width;
addRow("a", "12345678910");
addRow("as", "12345678910");
addRow("asd", "12345678910");
addRow("asdf", "12345678910");
addRow("asdfg", "12345678910");
measurementFont.Dispose();
graphics.Dispose();
}
void addRow(string name, string value) {
float width = graphics.MeasureString(name, measurementFont).Width;
int amountOfSpacesNeeded = Convert.ToInt32((maxNameWidth - width) / spaceWidth);
Console.WriteLine(name + " ".PadRight(amountOfSpacesNeeded) + content); // The console font is Arial
}
编辑:修复了使用填充 name 而不是实际乘以空格数量的愚蠢错误。结果现在好多了,但还是差了一点。我确实注意到五个空格的宽度不等于 spaceWidth * 5 虽然...
【问题讨论】:
-
你想要什么输出?
-
@GaurangDave 编辑显示它。
-
你能不能把“Console.WriteLine()”命令放在行之间,并在做某事之前和之后显示每个计算的值。检查数字,看看他们是否在做正确的事情。或者您也可以使用调试工具,但这是最简单的方法。如果您找不到解决方案,我(或其他任何人)可能会稍后回来查找问题。如果您在我们这样做之前找到了答案,请也发布答案。
-
这很奇怪。你真的在控制台上使用 Ariel 吗?无论如何,这种方法不适用于可变宽度字体,因为通常列之间所需的空间不会是空格字符宽度的偶数倍。正确的方法是在精确的像素偏移处绘制每个单独的列字符串。
-
@glenebob 是的,我正在使用 LinqPad 运行它,它允许我更改控制台输出的字体系列和大小。你提到的间距确实是真的——而且没有办法估计并将它也包括在计算中,是吗?不幸的是,我无法在使用此代码的地方使用实际绘图(纯文本环境),但如果下次可用,我会记住这一点,谢谢!