2012-05-24 33 views
0

我正在计算要打印的字符串的最大长度。我已经通过使用单间隔字体来完成这些工作,但是这些占用了页面上非常多的水平空间。我真的需要在每行打印更多字符而不将字体大小缩小到几乎看不到的水平,所以我想用sans-serif字体代替。这是我目前的打印功能:计算打印的最大字符串长度

public static void printPage(ref PrintPageEventArgs e, List<ReportLine> CompanyLetterhead, Queue<ReportLine> reportData) 
    { 
     int xPosition = e.MarginBounds.X; 
     int yPosition = e.MarginBounds.Y; 

     int maxCharacters = 0; 

     foreach (ReportLine line in CompanyLetterhead) 
     { 
      maxCharacters = e.MarginBounds.Width/(int)line.selectedFont.Size; 

      int position = 0; 

      while (line.text.Length - position > maxCharacters) 
      { 
       e.Graphics.DrawString(line.text.Substring(position, position + maxCharacters), line.selectedFont, Brushes.Black, xPosition, yPosition); 
       yPosition += line.selectedFont.Height; 
       position += maxCharacters; 
      } 
      if (line.text.Length - position > 0) 
      { 
       e.Graphics.DrawString(line.text.Substring(position), line.selectedFont, Brushes.Black, xPosition, yPosition); 
       yPosition += line.selectedFont.Height; 
      } 
     } 

     while (reportData.Count > 0 && checkLine(yPosition, e.MarginBounds.Bottom, reportData.Peek().selectedFont.Height)) 
     { 
      ReportLine currentLine = reportData.Peek(); 

      maxCharacters = e.MarginBounds.Width/(int)currentLine.selectedFont.Size; 

      if (currentLine.text.Length > maxCharacters) 
      { 
       string[] words = currentLine.text.Split(new char[] { ' ' , '\t' }); 
       string printString = ""; 

       bool endsInSpace = true; 

       foreach (string word in words) 
       { 
        if (word.Length + printString.Length < maxCharacters) 
        { 
         if (printString.Length > 0) 
         { 
          printString += " "; 
         } 
         printString += word; 
        } 
        else if (printString.Length == 0) 
        { 
         printString += word.Substring(0, maxCharacters); 
         endsInSpace = false; 
        } 
        else 
        { 
         break; 
        } 
       } 

       e.Graphics.DrawString(printString, currentLine.selectedFont, Brushes.Black, xPosition, yPosition); 
       yPosition += currentLine.selectedFont.Height; 
       if (endsInSpace) 
       { 
        currentLine.text = currentLine.text.Remove(0, printString.Length + 1); 
       } 
       else 
       { 
        currentLine.text = currentLine.text.Remove(0, printString.Length); 
       } 
      } 
      else 
      { 
       e.Graphics.DrawString(currentLine.text, currentLine.selectedFont, Brushes.Black, xPosition, yPosition); 
       yPosition += currentLine.selectedFont.Height; 
       reportData.Dequeue(); 
      } 
     } 

     e.HasMorePages = reportData.Count > 0; 
    } 

此功能使用ReportLine类对象,其定义如下:

public class ReportLine 
{ 
    public string text; 
    public Font selectedFont; 

    public ReportLine() 
    { 
     text = ""; 
     selectedFont = null; 
    } 

    public ReportLine(string txt, Font font) 
    { 
     text = txt; 
     selectedFont = font; 
    } 
} 

现在我怎样才能使这项工作与具有不同宽度的不同的字符的字体?我知道有一个名为Graphics.MeasureString的函数,但这只会告诉我所选字体的字符串的总宽度,所以这意味着如果它运行在页面的边缘,它会告诉我如何远远将会结束,而不是有多少角色会跑过来。

回答

0

也许您在寻找Graphics.MeasureCharacterRanges。您可以通过将字符串拆分为单词来确定传递给该方法的范围。这样你就可以知道每个单词有多宽,无论你喜欢缠绕。