「Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus arcu massa, tempus non tincidunt ut, tempus sit amet odio. Mauris in dui sed enim vulputate dictum」という文字列があるとします。
その文字列を特定の長さ (ピクセル単位) で、言葉を壊さずにラップしたい。たとえば、80 ピクセル。
文字列の描画に使用する Font 変数と Graphics 変数 (「g」と呼ばれることが多い) があるため、必要に応じて文字列の長さを測定できます。
私が見つけたすべてのサンプルは、テキストを文字長で折り返すだけでしたが、GDI+ 描画にはピクセル単位で必要です。バグがあるように見えるので、TextRenderer コントロールを使用したくありません。時々、それ自体のテキストの高さが間違っていると測定されます。まれですが、起こります。
これまでのところ、次のものが得られました。
public static string WrapTextByPixels(string text, ref Graphics g, Font font, float maxWidth)
{
string[] originalLines = text.Split(new[] { " " }, StringSplitOptions.None);
var wrapBuilder = new StringBuilder();
float currentLineWidth = 0;
foreach (var item in originalLines)
{
float itemWidth = g.MeasureString(item, font).Width;
currentLineWidth += itemWidth;
if (currentLineWidth > maxWidth ||
itemWidth > maxWidth) // When a single word is longer than the maxWidth then just add it
{
wrapBuilder.Append(Environment.NewLine);
currentLineWidth = 0;
}
wrapBuilder.Append(item + " ");
}
return wrapBuilder.ToString();
}
しかし、上記のコードは機能しません。一部の行はまだ長すぎます。