确定文本字符串中的行数?

时间:2011-02-16 17:10:32

标签: c# drawstring

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

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

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

6 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分: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;
}

答案 2 :(得分:2)

正如@Alexander建议的那样,一个好的,非常简单的方法就是在没有绘图的情况下测试它。让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); } } ,那么您可以使用此功能:

NSNumber

(此功能源自@Alexander答案。)

答案 3 :(得分:1)

我同意@David Heffernan提供了一个真正的沼泽标准实现。它的方式是复杂的他们将要实现的价值,或与一些将产生100%可靠的打印结果和报告服务。我感觉到你的痛苦,印刷是辛苦的!

答案 4 :(得分:1)

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

graphics.MeasureString("some string", new Font("Arial", 10))

答案 5 :(得分:0)

为什么不将它填充到富文本控件中并打印出来?不超过10-15行代码就可以完成。