0

印刷する文字列の最大長を計算しようとしています。私は等幅フォントを使用してこれを行いましたが、これらはページ上で非常に多くの横方向のスペースを占有します。フォントのサイズをほとんど見えないレベルまで縮小することなく、1 行あたりにより多くの文字を印刷する必要があるため、代わりにサンセリフ フォントを使用したいと考えています。ここに私の現在の印刷機能があります:

    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 という関数があることは知っていますが、これは選択したフォントでの文字列の合計幅のみを教えてくれるので、これは、ページの端をはみ出してしまった場合に、その方法を教えてくれることを意味します。何人のキャラクターが蹂躙されるかではなく、蹂躙されます。

4

1 に答える 1

0

Graphics.MeasureCharacterRangesを探しているのかもしれません。文字列を単語に分割することで、メソッドに渡す範囲を決定できます。そうすれば、好きなように折り返すために、各単語の幅を知ることができます。

于 2012-05-24T20:25:54.860 に答える