0

ベンガル語(仮想キーボード)または英語で書くことができるプログラムを作っています。印刷のプログラミングを始めるまでは、すべてが完璧でした。ユーザーは、任意のテキストを選択し、フォントと色を変更できる必要があります。すべての文字が異なる可能性があるため、文字ごとに印刷する必要があります。これが私のコードです:

private void printToolStripMenuItem_Click(object sender, EventArgs e)
{
    PrintDialog print = new PrintDialog();
    doc = new System.Drawing.Printing.PrintDocument();
    print.Document = doc;
    doc.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(printDoc);
    if (print.ShowDialog() == DialogResult.OK)
    {
        doc.Print();
    }
}

private void printDoc(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
    System.IO.StringReader reader = new System.IO.StringReader(richTextBox1.Text);
    float linesPerPage = 0;
    float yPosition = 0;
    int count = 0;
    float leftMargin = e.MarginBounds.Left;
    float rightMargin = e.MarginBounds.Right;
    float topMargin = e.MarginBounds.Top;
    string line = null;
    Font printFont = this.richTextBox1.Font;
    SolidBrush printBrush = new SolidBrush(Color.Black);
    int charpos = 0;
    int xPosition = (int)leftMargin;

    linesPerPage = e.MarginBounds.Height / printFont.GetHeight(e.Graphics);

    while (count < linesPerPage && ((line = reader.ReadLine()) != null))
    {
        xPosition = (int)leftMargin;
        yPosition = topMargin + (count * printFont.GetHeight(e.Graphics));
        count++;
        for (int i = 0; i < line.Length; i++)
        {
            richTextBox1.Select(charpos, 1);
            if ((xPosition + ((int)e.Graphics.MeasureString(richTextBox1.SelectedText, richTextBox1.SelectionFont).Width)) > rightMargin)
            {
                count++;
                if (!(count < linesPerPage))
                {
                    break;
                }
                xPosition = (int)leftMargin;
                yPosition = topMargin + (count * printFont.GetHeight(e.Graphics));
            }
            printBrush = new SolidBrush(richTextBox1.SelectionColor);
            e.Graphics.DrawString(richTextBox1.SelectedText, richTextBox1.SelectionFont, printBrush, new PointF(xPosition, yPosition));
            xPosition += ((int)e.Graphics.MeasureString(richTextBox1.SelectedText, richTextBox1.SelectionFont).Width);
            charpos++;
        }
    }

    if (line != null)
    {
        e.HasMorePages = true;
    }
    else
    {
        e.HasMorePages = false;
        printBrush.Dispose();
    }
}

ただし、印刷プレビューを取得すると、各文字の間にスペースが表示されます。

印刷プレビュー

e.Graphics.MeasureString()これは、可能な限り狭い境界ボックスが表示されないか、フォントで指定されている文字の正確な幅が表示されないためだと思います。私はC#にまったく慣れていません。文字の正確な幅を取得する方法を知っている人はいますか?それは長い間私を困惑させてきました。

4

2 に答える 2

1

このMSDNの記事によると:

(グラフィックスクラス)MeasureStringメソッドは、個々の文字列で使用するように設計されており、文字列の前後に少量の余分なスペースが含まれているため、グリフをオーバーハングさせることができます。

代わりに、 TextRenderer.MeasureString()を使用して、正確なフォント幅を取得できます。

于 2012-07-29T02:21:53.650 に答える
1

とった。ついに。やっぱり使う必要がありますe.Graphics.MeasureString()。それのちょうど別の過負荷。これを使って:

e.Graphics.MeasureString(richTextBox1.SelectedText, richTextBox1.SelectionFont, new PointF(xPosition, yPosition), StringFormat.GenericTypographic).Width;

スペースを削除するには、StringFormat.GenericTypographicを渡す必要があります。それが役に立てば幸い。(上記に置き換えると、私のコードを使用して、異なる色とテキストでテキストを印刷できますe.Graphics.MeasureString(string, Font))。

于 2012-07-29T04:08:34.163 に答える