我想用GDI+在矩形中绘制一些文本,就像这篇微软文章中描述的那样:https://msdn.microsoft.com/en-us/library/baw6k39s(v=vs.110).aspx。
在指定所需宽度后,文本会自动换行到下一行,这正是我的意图。问题是,我需要设置矩形的高度,以使文本完美地适配框内,没有被裁剪,也没有额外的空白。在这种情况下,试错性测试值将根本行不通,因为文本将发生变化。
我实现了一个解决方案,模拟呈现时将发生的文本换行并添加换行符来测量其高度。但是,这似乎并未起作用,矩形的高度通常具有大量的末尾空白(似乎与文本数量呈正线性关系)。 问题:
我的代码如下:
然而,这似乎有些过度,必须有更好的方法。因此,我想这实际上是一个包含两个问题的问题。
1. 如何使我的当前解决方案工作? 2. 有没有更好的方法来完成这个任务?
注意:使用调试器,我已确定breaklen变量是正确的。它读取11个字符,每行有11个字符。
我还使用固定宽度字体(Consolas系列)检查了其他字符,它们都产生相同的断点长度。这是StringBuilder处理换行符的问题吗?我通常使用Java而不是C#,所以我对流等不熟悉。
编辑后的绘图代码如下:
在指定所需宽度后,文本会自动换行到下一行,这正是我的意图。问题是,我需要设置矩形的高度,以使文本完美地适配框内,没有被裁剪,也没有额外的空白。在这种情况下,试错性测试值将根本行不通,因为文本将发生变化。
我实现了一个解决方案,模拟呈现时将发生的文本换行并添加换行符来测量其高度。但是,这似乎并未起作用,矩形的高度通常具有大量的末尾空白(似乎与文本数量呈正线性关系)。 问题:
![enter image description here](https://istack.dev59.com/qUuzk.webp)
public void setBreakLen() { //determines how many chars fit on each line (note: using a FIXED WIDTH FONT)
double cwidth = TextRenderer.MeasureText("h", font).Width;
breakLen = (int)((double)box.Width / (double)cwidth);
}
public void updateHeight() { //should tell me what the height of the box should be to fit perfectly
StringBuilder sb = new StringBuilder(text);
int numAppended = 0;
for (int i = 0; i < text.Length; i++) {
if ((i + 1) % breakLen == 0) {
sb.Insert((i + 1 + numAppended), "\n");
numAppended += 1;
}
}
Size s = TextRenderer.MeasureText(sb.ToString(), font);
height = s.Height;
box = new Rectangle(x, y, width, height);
}
然而,这似乎有些过度,必须有更好的方法。因此,我想这实际上是一个包含两个问题的问题。
1. 如何使我的当前解决方案工作? 2. 有没有更好的方法来完成这个任务?
注意:使用调试器,我已确定breaklen变量是正确的。它读取11个字符,每行有11个字符。
我还使用固定宽度字体(Consolas系列)检查了其他字符,它们都产生相同的断点长度。这是StringBuilder处理换行符的问题吗?我通常使用Java而不是C#,所以我对流等不熟悉。
编辑后的绘图代码如下:
g2d.DrawString(m.text, m.font, Brushes.Blue, m.box);
g2d.DrawRectangle(Pens.Black, Rectangle.Round(m.box));
编辑2:
我尝试使用MeasureText
函数的重载Size
参数来实现这个辅助解决方案。 无论字符串的长度如何,它都只返回19,似乎仅返回单行的正确高度。
Size s = TextRenderer.MeasureText(text, font, new Size(width, 0));//i also tried MaxInt
height = s.Height;
Console.WriteLine(height);
box = new Rectangle(x, y, width, height);
Size
参数,并传入一个Height
为Int32.MaxValue
的值。返回的Size
对象的Height
属性将被设置为呈现文本所需的最小高度。 - Bradley Uffner