5

印刷クラスの一環として、長い文字列を複数のページに印刷できるようにしたいのですが、文字列全体の高さを計算する方法がわかりません。これは、最初に文字列の行数を数えることによって決定されます. 改行の数を数えることができることは知っていますが、ワードラップも使用しているため、行がページの幅を超えるたびに改行が追加されます。だから、改行の数を数えて、各行の幅を把握し、各行にワードラップ改行が必要かどうかを把握できると思いますが、これは何かにとって非常に複雑な問題のようですもっと簡単にできると思います。

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

何かアドバイスがあれば教えてください よろしくお願いします!

4

6 に答える 6

7
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);
于 2012-05-11T03:19:31.657 に答える
2

@Alexander示唆したように、1つの優れた非常に単純なアプローチは、描画せずにテストすることです。Graphicsあなたのためにテストをしましょう。

行の最大長が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);
    }
}

(この関数は@Alexander の回答から派生しています。)

于 2016-08-24T10:23:37.077 に答える
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;
}
于 2011-02-16T17:40:56.123 に答える
1

文字列のサイズを測定する場合は、Graphics.MeasureString(string, Font) メソッドを使用します。

graphics.MeasureString("some string", new Font("Arial", 10))
于 2011-02-16T17:21:23.703 に答える
1

@David Heffernanが本当に沼地の標準実装を提供することに同意します。彼らが達成しようとしている価値のために複雑になる方法、または100%信頼できる印刷結果などを生成するものを使用するレポートサービス. 私はあなたの痛みを感じます、印刷は骨の折れるものです!

于 2011-02-16T17:19:22.733 に答える
0

それをリッチ テキスト コントロールに詰め込んで印刷してみませんか。10 ~ 15 行のコードで完了する必要があります。

于 2011-02-16T17:17:02.880 に答える