C#打印收银小票:未知字符串长度时如何定义矩形高度?
解决收银小票打印文本出现大片空白的问题
嗨,这个问题我太熟了!你这明显是把字符数量和文本实际渲染高度搞混啦,难怪会出现一大段空白后才显示内容。
问题根源
你原来用SALE.Length作为矩形高度,这完全是概念错误:字符数是文本的横向字符总数,而矩形高度是文本在纵向需要的空间,两者没有直接关系。当字符串很长时,这个高度值会被拉得特别大,DrawString会把文本放在这个超大矩形的顶部,剩下的空白自然就占了一大片位置。
正确解决方案:让GDI+自动计算文本高度
不要自己瞎猜高度,直接用Graphics.MeasureString方法让系统帮你计算文本在指定宽度下的实际占用尺寸,然后用这个真实高度来设置矩形或者定位绘制。
修改后的代码示例:
// 先从数据库获取字符串 SALE = dr2["PRINTMESSAGESALE"].ToString(); // 计算文本在小票宽度(275)下的实际尺寸,记得传入你实际使用的字体 SizeF textSize = graphics.MeasureString(SALE, yourFont, 275); // 创建适配文本的矩形,高度用计算出来的真实高度 var textRect = new RectangleF(2, 5 + offX, 275, textSize.Height); // 绘制文本 graphics.DrawString(SALE, yourFont, Brushes.Black, textRect); // 重要:打印完这段文本后,记得更新offX偏移量,让后续内容能接着往下打 offX += textSize.Height;
额外提示
MeasureString会自动处理多行文本:如果文本长度超过小票宽度,它会自动换行,并计算出换行后的总高度。- 如果你需要给文本留一点上下边距,可以在计算出来的
textSize.Height基础上再加几个像素,比如textSize.Height + 4,这样文本不会和上下内容挤在一起。
内容的提问来源于stack exchange,提问作者abru
相关产品推荐
相关产品推荐

