如何通过文本渲染器使字符串的一部分符合矩形布局

时间:2015-03-30 13:47:06

标签: c# winforms text-rendering

我正在尝试在位图上绘制一个字符串,但如果文本太长,文本部分文本可能会被文本渲染器剪切掉。如果我能找到写入文本的哪一部分,我可以将其余部分写在另一个位图上。

C#中是否有任何文本渲染功能,因此它获取文本和建议的布局矩形并返回在布局矩形中写入(拟合)的字符串数量?

string fittedString = TextRenderer.DrawText(graphics, text, rectangle);

如果不是,最简单的方法是什么?

2 个答案:

答案 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;
    }