2011-02-16 11 views
3

作爲打印類的一部分,我希望能夠在多個頁面上打印長字符串,但我不知道如何計算整個字符串的高度,我將首先通過計算行數我的字符串。我知道我可以計算換行符的數量,但我也正在使用換行符,所以只要一行代碼超過頁面寬度,就會添加換行符。所以我想我可以計算換行符的數量,並計算出每行的寬度,並計算出每行是否需要換行換行,但這似乎是某種過於複雜的問題我想可以做得更簡單。確定文本字符串中的行數?

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

如果您有任何建議,請讓我知道謝謝!

+1

仍在掙扎的印刷!嚴重使用另一種工具!你能提供一些關於你的環境的更多信息嗎?等窗口形式.NET版本。 – Jonathan 2011-02-16 17:13:03

+0

Windows XP,看起來像我已經安裝了.NET 3.5,這只是一個直接的代碼類,可以在WinForms或任何地方使用。我很樂意使用不同的打印解決方案,但我非常接近完成我需要的所有內容(儘管它已經成爲了一個超級痛苦的對象) – sooprise 2011-02-16 17:24:41

+0

是的,這就是我對當前項目所說的話,然後事實證明它永遠不夠。商業用戶總是需要更多。另外,您還有解決方案來維護。如果它幾乎完成可能值得完成,但告訴業務任何額外的變化需要新的解決方案! – Jonathan 2011-02-16 17:35:51

回答

1

我同意@David Heffernan提供了一個真正的bog標準實現。它的方法可以使他們將要實現的價值變得複雜,或者使用能夠產生100%可靠的印刷結果的東西,例如Reporting Services。我感到你的痛苦,印刷是辛苦的!

0

你爲什麼不把它塞進一個豐富的文本控件並打印出來?不超過10-15行的代碼應該完成。

+0

您是否仍需要設置RichTextBox控件的尺寸才能正確打印?此外,你是不是想用RichTextBox.DrawToBitmap來打印它(有沒有其他方法?) – sooprise 2011-02-16 17:19:57

1

如果你要測量的字符串使用方法Graphics.MeasureString的大小(字符串,字體)

graphics.MeasureString("some string", new Font("Arial", 10)) 
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; 
} 
4
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

由於@Alexander建議,一個好漂亮的簡單的方法是隻是爲了測試它無圖紙。讓Graphics爲你做測試。

假設你有在像素wrapWidth行的最大長度,並且要檢查字符串是multiPageString,那麼你可以使用這個功能:(此功能是從@Alexander應答所得出)

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