我用:
label1.MaximumSize = new Size(100,0);
label1.AutoSize = true;
自动换行标签。并使用
e.Graphics.DrawString(label1.Text,new SolidBrush(Color.Black),10,10);
打印标签。
但现在出现问题:DrawString只将label1.Text视为“纯字符串”。它不包括任何包装。所以我的结果看起来像
This is a printing test!
而不是:
This is a printing
test!
它应该是什么。有什么方法我可以知道文本的包装位置(在这种情况下“打印”之后),所以我可以添加\n
以获得正确的打印结果吗?
或者除了向其添加\n
之外,还有更好的方法可以做到这一点吗?
示例中的数字只是示例。无论如何,他们不正确的测量。
答案 0 :(得分:1)
Graphics.MeasureString应该为您提供字符串的宽度。然后,当它达到你的最大值时,你可以将它分开,也许使用StringBuilder,这样你就可以随时获得它。
string text = "This is a printing test!";
Font stringFont = new Font("Arial", 16);
using (Graphics g = Graphics.FromHwnd(IntPtr.Zero))
{
var sb = new StringBuilder();
foreach (var c in text.ToArray())
{
var l = g.MeasureString(sb.Append(c).ToString(), stringFont);
if (l.Width >= 100)
{
sb.Append(Environment.NewLine);
}
Console.WriteLine($"String: {sb.ToString()} Length: {l.Width.ToString()}");
}
}
更新
static void Main(string[] args)
{
var s = "This is a printing test!";
var f = new Font("Arial", 16);
var w = 100d;
Console.WriteLine(BreakIntoLines(s, w, f));
}
public static string BreakIntoLines(string s, double w, Font f)
{
using (Graphics g = Graphics.FromHwnd(IntPtr.Zero))
{
var sb = new StringBuilder();
var pw = 0d;
foreach (var c in s.ToArray())
{
var lw = Math.Floor(g.MeasureString(sb.Append(c).ToString(), f).Width / w);
if (lw != pw)
{
sb.Append(Environment.NewLine);
pw = lw;
}
}
return sb.ToString();
}
}
更新(按字分割,不是字符):
using (Graphics g = Graphics.FromHwnd(IntPtr.Zero))
{
var words = s.Split(' ');
var sb = new StringBuilder();
var pw = 0d;
foreach (var word in words)
{
var lw = Math.Floor(g.MeasureString($"{sb.ToString()} {word}", f).Width / w);
if (lw != pw)
{
sb.Append($"{Environment.NewLine}{word} ");
pw = lw;
}
else
{
sb.Append($"{word} ");
}
}
return sb.ToString();
}
答案 1 :(得分:0)
我发现了一件令人惊奇的事情!
您可以使用DrawString将文本打印到Rectangle中,而不是为您自动换行!
e.Graphics.DrawString(label1.Text,label1.Font,new SolidBrush(Color.Black),
new Rectangle(label1.Left,label1.Top,label1.Width,label1.Height));