5

作为打印类的一部分,我希望能够在多页上打印长字符串,但我不知道如何计算整个字符串的高度,我将通过首先计算字符串中的行数来确定. 我知道我可以计算换行的数量,但我也在使用自动换行,所以只要一行超过页面宽度,就会添加换行。所以我想我可以计算换行的数量,并计算出每行的宽度,并确定是否需要为每行换行换行,但这似乎是一个过于复杂的问题我想可以做得更简单。

e.Graphics.DrawString(multiPageString, new Font("Courier New", 12), Brushes.Black, new RectangleF(0, 0, 810, pageHeight));

如果您有任何建议,请告诉我,谢谢!

4

6 回答 6

7
int iMaxWidth = 240; // Maximum width, in pixels
string sText = @"blah-blah-blah";
Font objFont = new Font("Times New Roman", 13, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Point);
StringFormat sfFmt = new StringFormat(StringFormatFlags.LineLimit);
Graphics g = Graphics.FromImage(new Bitmap(1, 1));
int iHeight = (int)g.MeasureString(sText, objFont, iMaxWidth, sfFmt).Height;
int iOneLineHeight = (int)g.MeasureString("Z", objFont, iMaxWidth, sfFmt).Height;
int iNumLines = (int)(iHeight/iOneLineHeight);
于 2012-05-11T03:19:31.657 回答
2

这可以编辑,但您可能可以将其用作起始位置?

const int PAGE_MAX_CHARS_PER_LINE = 30;
var message = "this is a really long line and it will make your eyes pop out but I don't know how to present a long line differently.  So you will have to stick with\r\nit.   I think the above line should be long enough\r\n\r\n I would love to see how this turns out.";
var lines = message.Split(new string [] {"\r\n"}, StringSplitOptions.None);
var linesCount = lines.Length;

var longLines = lines.Where(i=>i.Length > PAGE_MAX_CHARS_PER_LINE);
foreach(var l in longLines)
{
  int numberOfLines = (int)Math.Ceiling((double)l.Length / PAGE_MAX_CHARS_PER_LINE); /// Will need to embed graphics measurement mechanism here?
  linesCount += numberOfLines - 1;
}
于 2011-02-16T17:40:56.123 回答
2

正如@Alexander 所建议的那样,一种很好且非常简单的方法就是在不绘图的情况下对其进行测试。让我们Graphics为你做测试。

假设您的最大行长为wrapWidth像素,并且您要检查的字符串是multiPageString,那么您可以使用此函数:

private int GetNumOfLines(string multiPageString, int wrapWidth, Font fnt)
{
    StringFormat sfFmt = new StringFormat(StringFormatFlags.LineLimit);
    using(Graphics g = Graphics.FromImage(new Bitmap(1, 1)))
    {
        int iHeight = (int)g.MeasureString(multiPageString, fnt, wrapWidth, sfFmt).Height;
        int iOneLineHeight = (int)g.MeasureString("Z", fnt, wrapWidth, sfFmt).Height;
        return (int)(iHeight/iOneLineHeight);
    }
}

(这个函数来自@Alexander 的回答。)

于 2016-08-24T10:23:37.077 回答
1

我同意@David Heffernan 提供了一个非常糟糕的标准实现。它使他们将要实现的价值变得复杂,或者采用能够产生 100% 可靠打印结果的东西等 Reporting Services。我感受到你的痛苦,印刷很辛苦!

于 2011-02-16T17:19:22.733 回答
1

如果要测量字符串的大小,请使用方法 Graphics.MeasureString(string, Font)

graphics.MeasureString("some string", new Font("Arial", 10))
于 2011-02-16T17:21:23.703 回答
0

你为什么不把它塞进富文本控件并打印出来呢?不超过 10-15 行代码就可以完成。

于 2011-02-16T17:17:02.880 回答