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

c#-以正确的间距打印RichTextBox文本,c#,printing,size,richtextbox,C#,Printing,Size,Richtextbox,我正在制作一个可以用孟加拉语(虚拟键盘)或英语编写的程序。在我开始编程打印之前,一切都很完美。用户应该能够选择任何文本并更改字体和颜色。因为每个字符都可能不同,所以我需要一个字符一个字符地打印。这是我的密码: private void printToolStripMenuItem_Click(object sender, EventArgs e) { PrintDialog print = new PrintDialog(); doc = new System.Drawing.P

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

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();
    }
}
private void printToolStripMenuItem\u单击(对象发送方,事件参数e)
{
PrintDialog print=新建PrintDialog();
doc=新系统.Drawing.Printing.PrintDocument();
打印.单据=单据;
doc.PrintPage+=新系统.Drawing.Printing.PrintPageEventHandler(printDoc);
if(print.ShowDialog()==DialogResult.OK)
{
doc.Print();
}
}
私有void printDoc(对象发送者,System.Drawing.Printing.PrintPageEventArgs e)
{
System.IO.StringReader reader=新的System.IO.StringReader(richTextBox1.Text);
float linesPerPage=0;
浮动位置=0;
整数计数=0;
浮动左边距=e.MarginBounds.Left;
浮动右边距=e.MarginBounds.Right;
浮动顶部边距=e.MarginBounds.Top;
字符串行=null;
Font printFont=this.richTextBox1.Font;
SolidBrush printBrush=新的SolidBrush(颜色为黑色);
int charpos=0;
int xPosition=(int)leftMargin;
linesPerPage=e.MarginBounds.Height/printFont.GetHeight(e.Graphics);
而(countrightMargin)
{
计数++;
如果(!(计数
然而,当我得到打印预览时,它会在每个字符之间显示一个空格:

我认为这是因为
e.Graphics.MeasureString()
没有给我尽可能紧密的边界框,或者没有给我字体指定的字符的确切宽度。我对C#很陌生,有人知道一种获得角色确切宽度的方法吗?这一直困扰着我很长时间。

根据MSDN文章:

(图形类)MeasureString方法设计用于单个字符串,并在字符串前后包含少量额外空间,以允许悬垂图示符


您可以改为使用以获得精确的字体宽度。

了解。最后毕竟,您需要使用
e.Graphics.MeasureString()
。只是又一次超载。使用以下命令:

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

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

不起作用,我得到了相同的结果。我刚刚用
textrender.MeasureText()
替换了所有我有
e.Graphics.MeasureString()
的地方,但它不起作用。我的代码有什么问题吗?
TextRenderer.MeasureText()
的MSDN备注部分说
MeasureText方法要求在单行上绘制文本。