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

知道了。最后。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 回答
1

根据这篇MSDN 文章:

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

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

于 2012-07-29T02:21:53.650 回答