在Visual C#

时间:2018-01-25 05:31:24

标签: c# printing position 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!

它应该是什么。有什么方法我可以知道文本的包装位置(在这种情况下“打印”之后),所以我可以添加\n以获得正确的打印结果吗?

或者除了向其添加\n之外,还有更好的方法可以做到这一点吗?

示例中的数字只是示例。无论如何,他们正确的测量。

2 个答案:

答案 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));