使用Graphics.DrawString在C#中打印长字符串

问题描述 投票:0回答:1

早上好。我必须打印一些长的字符串,这些字符串落在页面的空白处。我无法自动拆分为多行字符串。

private void pd_PrintPage(object sender, PrintPageEventArgs ev)
{
  ...
  string line ="Condimentum a a ac aenean parturient risus suscipit et orci scelerisque convallis porttitor enim venenatis viverra.Egestas nibh natoque mus etiam a parturient feugiat hendrerit a sagittis viverra dui ante varius lectus arcu."
  float leftMargin = ev.MarginBounds.Left;
  float topMargin = ev.MarginBounds.Top;    
  ev.Graphics.DrawString(line, printFont, Brushes.Black, new RectangleF(leftMargin, yPos, 400.0f, 200.0f));
  ...
}

如您所见,我尝试将重载与边界框规格一起使用,但结果是页面上出现了字符阻塞,因为长字符串中的行被打印在其自身上。

是否有解决此问题的快速方法?

谢谢

c# multiline multilinestring
1个回答
0
投票

已解决我终于解决了我的问题。解释起来不是那么容易,所以我在这里发布了一段代码,显示了我的所作所为:

private void pd_PrintPage(object sender, PrintPageEventArgs ev)
    {
        float linesPerPage = 0;
        int count = 0;
        float leftMargin = ev.MarginBounds.Left;
        float topMargin = ev.MarginBounds.Top;
        float printAreaHeight = ev.MarginBounds.Height;
        float printAreaWidth = ev.MarginBounds.Width;
        string line = null;
        float yPos = topMargin;

        int charactersFitted = 0;
        int linesFilled = 0;
        SizeF theSize = new SizeF();
        Font printFont = new Font("Arial", 12, FontStyle.Regular);

        SizeF layoutSize = new SizeF(printAreaWidth, printAreaHeight);

        // Calculate the number of lines per page.
        linesPerPage = printAreaHeight / printFont.GetHeight(ev.Graphics);

        // Print each line of the array.
        while (count < linesPerPage && lineIdx < linesArray.Count())
        {
            line = linesArray[lineIdx++];
            theSize = ev.Graphics.MeasureString(line, printFont, layoutSize, new StringFormat(), out charactersFitted, out linesFilled);
            ev.Graphics.DrawString(line, printFont, Brushes.Black, new RectangleF(50.0F, yPos, theSize.Width, theSize.Height));
            yPos += (1 + linesFilled) * printFont.GetHeight(ev.Graphics);
            count += linesFilled + 1;
         }

         // If more lines exist, print another page.
         if (count > linesPerPage)
            ev.HasMorePages = true;
         else
            ev.HasMorePages = false;
    }
© www.soinside.com 2019 - 2024. All rights reserved.