在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)背景色设置成透明?

C#Visual Studio 2017.单词在文本框和标签中更改了顺序

如何在Visual Studio中包含路径?