在Visual C#中包装在Label中的单词的位置
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Visual C#中包装在Label中的单词的位置相关的知识,希望对你有一定的参考价值。
我用:
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!
它应该是什么。有什么方法我可以知道文本的包装位置(在这种情况下“打印”之后)所以我可以添加
以获得正确的打印结果吗?
或者除了添加
之外,还有更好的方法可以做到这一点?
示例中的数字只是示例。无论如何,它们都不是正确的衡量标准。
答案
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();
}
另一答案
我发现一件事太棒了!
您可以使用DrawString将文本打印到Rectangle中,而不是为您自动换行!
e.Graphics.DrawString(label1.Text,label1.Font,new SolidBrush(Color.Black),
new Rectangle(label1.Left,label1.Top,label1.Width,label1.Height));
以上是关于在Visual C#中包装在Label中的单词的位置的主要内容,如果未能解决你的问题,请参考以下文章
为啥我的visual studio service pack 6 不能安装啊?是否一定要装在C盘?我的VC6.0是装在D盘的。
如何在 Visual Studio、C# 项目的部署中包含文件和文件夹?
在 Visual Basic 2008 中如何将标签(Label)背景色设置成透明?