如何检测指定字体下一行可打印的字符数
解决思路
因为你用的是等宽字体(Lucida Console),每个字符宽度一致,可通过以下步骤计算单行可打印的最大字符数:
- 第一步:获取打印区域的可用宽度,直接调用
PrintPageEventArgs的MarginBounds.Width属性,这是去除页面边距后的实际可打印宽度。 - 第二步:计算单个字符的实际宽度,用
Graphics.MeasureString方法传入单个测试字符(比如"A")和目标字体,得到该字符在打印上下文里的准确宽度。 - 第三步:用可用宽度除以单个字符宽度,向下取整得到单行能容纳的最大字符数(确保不会超出打印边界)。
修改后的代码示例:
private static void pr__PrintPage(object sender, PrintPageEventArgs e) { var font = new Font("Lucida Console", 10); // 计算单个字符的打印宽度 char testChar = 'A'; float charWidth = e.Graphics.MeasureString(testChar.ToString(), font).Width; // 获取去除边距后的可打印宽度 float availableWidth = e.MarginBounds.Width; // 计算单行最大字符数,向下取整避免超出边界 int number_or_characters = (int)Math.Floor(availableWidth / charWidth); // 可选:为规避字体渲染的微小误差,可适当减1 // number_or_characters = Math.Max(0, number_or_characters - 1); var text = new string('A', number_or_characters); e.Graphics.DrawString(text, font, new SolidBrush(Color.Black), 0, 0); }
补充说明:
- 如果使用非等宽字体,需要循环累加字符宽度直到接近可用宽度,但你的场景是等宽字体,上述方法足够高效准确。
MeasureString会自动适配当前Graphics的打印上下文(如DPI、单位),无需额外做单位转换。
内容的提问来源于stack exchange,提问作者pedroPG
相关产品推荐
相关产品推荐

