我正在编写一个可以用孟加拉文(虚拟键盘)或英文编写的程序。在我开始编程打印之前,一切都很完美。用户应该能够选择任何文本并更改字体和颜色。因为每个角色都可能不同,我需要逐个字符地打印。这是我的代码:
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#很陌生有人知道如何获得角色的确切宽度吗?它已经困扰了我很长时间。
答案 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)
,您可以使用我的代码打印具有不同颜色和文本的文本。)