我正在尝试在位图上绘制一个字符串,但如果文本太长,文本部分文本可能会被文本渲染器剪切掉。如果我能找到写入文本的哪一部分,我可以将其余部分写在另一个位图上。
C#中是否有任何文本渲染功能,因此它获取文本和建议的布局矩形并返回在布局矩形中写入(拟合)的字符串数量?
string fittedString = TextRenderer.DrawText(graphics, text, rectangle);
如果不是,最简单的方法是什么?
答案 0 :(得分:1)
不是我所知道的,但您可以通过在循环中对字符串的每个字符调用MeasureText()
来获得近似值,并在变量中将返回的宽度汇总为W
。当总和超过目标矩形的宽度时,您只需在单独的变量H
中选择该行的最大值字符高度。到达每一行的末尾后,在H
中添加当前行的最大高度值。
您一直这样做,直到H
的值超过目标矩形的高度。这只是适合矩形的字符数。
像这样(手写,plz调整):
int HowManyChars(Graphics g, Font font, string text, Rectangle r)
{
float W=0, H=0, MaxH=0;
int i=0;
for(i=0; i< text.Length; i++)
{
var sz = g.MeasureString(text[i].ToString(), font);
W+= sz.Width;
if(W > r.Width)
{
W=sz.Width;
H+=MaxH;
MaxH = 0;
if(H>r.Height) break;
}
else
{
if(sz.Height > MaxH) MaxH = sz.Height;
}
}
return i;
}
答案 1 :(得分:0)
TextRenderer.MeasureText(...)
方法返回Size
值,该值确定绘制文本所需的大小。但是,此方法要求将文本绘制在一行上。 TextFormatFlags.WordBreak
选项使其将文本包装在建议的布局中。
我们将建议布局的宽度设置为目标矩形宽度,并在循环中测量此布局中呈现的主文本的子字符串的大小。如果方法返回的size.Height
超过目标矩形的高度,那么我们停止并返回索引。
int HowManyChars(Font font, string text, Rectangle r)
{
int i = 0;
for (; i < text.Length; i++)
{
string str = text.Substring(0, i);
var size = TextRenderer.MeasureText(str, font,
new Size(r.Width, 0), TextFormatFlags.WordBreak);
if (size.Height > r.Height)
break;
}
return i;
}