2012-02-18 53 views
0

我已經有了這段代碼,但它給了我錯誤的結果。如何獲得適合一行的字符數(打印c#)

private void document_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e) 
    { 
    int charPerLine = e.MarginBounds.Width/(int)e.Graphics.MeasureString("m", txtMain.Font).Width; 
    } 

txtMain是一個文本框。

+0

您的字體是固定寬度還是可變寬度字體?如果它是可變寬度的字體,您將無法準確執行測量。 – AndyGeek 2012-02-18 23:29:29

+0

如果您僅打印'|'s 1000,而是'@'500 :) – 2012-02-18 23:29:55

+0

我正在用快遞新字體進行測試,我認爲它是固定寬度 – 2012-02-18 23:58:20

回答

2

這應該可以做到。除以變量轉換爲整數時要小心。如果Width屬性小於1,那麼您將自己打開分割零,這將被截斷爲零。您的應用程序中可能不會有這麼小的字體,但這仍然是一個好習慣。

private void document_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e) 
{ 
    if((int)e.Graphics.MeasureString("m", txtMain.Font).Width > 0) 
    { 

     int charPerLine = 
      e.MarginBounds.Width/(int)e.Graphics.MeasureString("m", txtMain.Font).Width; 
    } 
} 

但真正的問題是爲什麼你甚至需要知道每行字符數。除非您嘗試進行某種ASCII藝術處理,否則您可以使用Graphics.DrawString的不同重載,讓GDI +在邊界矩形內爲您排列文本,而無需知道一行中有多少個字符。

This sample from MSDN告訴您如何做到這一點:

// Create string to draw. 
String drawString = "Sample Text"; 

// Create font and brush. 
Font drawFont = new Font("Arial", 16); 
SolidBrush drawBrush = new SolidBrush(Color.Black); 

// Create rectangle for drawing. 
float x = 150.0F; 
float y = 150.0F; 
float width = 200.0F; 
float height = 50.0F; 
RectangleF drawRect = new RectangleF(x, y, width, height); 

// Draw rectangle to screen. 
Pen blackPen = new Pen(Color.Black); 
e.Graphics.DrawRectangle(blackPen, x, y, width, height); 

// Set format of string. 
StringFormat drawFormat = new StringFormat(); 
drawFormat.Alignment = StringAlignment.Center; 

// Draw string to screen. 
e.Graphics.DrawString(drawString, drawFont, drawBrush, drawRect, drawFormat); 

所以,如果你要打印文本的頁面,你可以設置drawRecte.MarginBounds和插件文本的網頁值得在drawString 。另一件事,如果你試圖打印表格數據,你可以將頁面分割成矩形 - 每列/行(不過你需要它),並使用重載打印表格邊界。

如果您發佈更多關於您實際嘗試實現的細節,我們可以提供更多幫助。