c# - 以正确的间距打印RichTextBox文本

时间:2012-07-29 02:09:50

标签: c# printing size richtextbox

我正在编写一个可以用孟加拉文(虚拟键盘)或英文编写的程序。在我开始编程打印之前,一切都很完美。用户应该能够选择任何文本并更改字体和颜色。因为每个角色都可能不同,我需要逐个字符地打印。这是我的代码:

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();
    }
}

但是,当我获得打印预览时,它会在每个字符之间显示一个空格:

print preview

我认为这是因为e.Graphics.MeasureString()没有给我最紧密的边界框,或者它没有给我字体指定的字符的确切宽度。我对C#很陌生有人知道如何获得角色的确切宽度吗?它已经困扰了我很长时间。

2 个答案:

答案 0 :(得分:1)

根据this MSDN文章:

  

(Graphics Class)MeasureString方法设计用于单个字符串,并在字符串之前和之后包含少量额外空格以允许悬垂字形

您可以使用TextRenderer.MeasureString()来获取精确的字体宽度。

答案 1 :(得分:1)

GOT IT。最后。毕竟你需要使用e.Graphics.MeasureString()。只是它的另一个重载。使用此:

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

删除传递StringFormat.GenericTypographic所需的空间。希望能帮助到你。 (如果用以上内容替换e.Graphics.MeasureString(string, Font),您可以使用我的代码打印具有不同颜色和文本的文本。)

相关问题