C# 在Visual C中,单词在标签中的位置#
我使用: 自动包装标签。和使用C# 在Visual C中,单词在标签中的位置#,c#,printing,position,label,C#,Printing,Position,Label,我使用: 自动包装标签。和使用 label1.MaximumSize = new Size(100,0); label1.AutoSize = true; 打印标签 但现在问题来了:DrawString只将label1.Text作为“纯字符串”。它不包括任何包装。所以我的结果看起来像 e.Graphics.DrawString(label1.Text,new SolidBrush(Color.Black),10,10); 而不是: This is a printing test! 应该是这
label1.MaximumSize = new Size(100,0);
label1.AutoSize = true;
打印标签
但现在问题来了:DrawString只将label1.Text作为“纯字符串”。它不包括任何包装。所以我的结果看起来像
e.Graphics.DrawString(label1.Text,new SolidBrush(Color.Black),10,10);
而不是:
This is a printing test!
应该是这样的。是否有任何方法可以知道文本的包装位置(在本例中为“打印”之后),以便向其添加\n
,以获得正确的打印结果
或者,除了添加\n
之外,还有更好的方法吗
示例中的数字只是示例。无论如何,它们都不是正确的测量值。Graphics.MeasureString应该为您提供字符串的宽度。然后,当它达到最大值时,您可以将其拆分,也许可以使用StringBuilder,这样您就可以在运行时获得它
This is a printing
test!
更新:
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()}");
}
}
更新(按单词而非字符分割):
我发现一件事很神奇 您可以使用DrawString将文本打印成矩形,然后它会自动为您包装文本
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();
}
谢谢你的回答。。。但这是。。。辛苦!!!>“<没有更好的方法吗!?如果不知道每个字母的宽度以及要使用什么字体来显示它,就无法推断字符串的大小。你可以猜,但你总是错的。这是作为POC的快速代码。我确信它可以被清理。请参阅更新的代码。好的……说……如果我附加,会更好吗?”一次一个单词“!?”它不会在词的中间被切断吗?是的,这是有意义的。更新。
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();
}
e.Graphics.DrawString(label1.Text,label1.Font,new SolidBrush(Color.Black),
new Rectangle(label1.Left,label1.Top,label1.Width,label1.Height));