C#打印时获得字符串的正确像素高度,可使字符居中及精确定位

页面长宽属性:
PrintPageEventArgs.PageBounds 属性   表示页面全部区域的矩形区域。
PrintPageEventArgs.MarginBounds 属性 以百分之一英寸为单位的矩形区域,表示边距以内的页面部分。

测量字符串的方法:
PrintPageEventArgs.Graphics.MeasureString 方法 (String, Font)

于是我用下面的方法使字符串居中显示:
private void prtDoc_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
    {
        Font strFont = new Font("Arial", 32);
        string s = "这是第1页";
        e.Graphics.DrawString(s, strFont, Brushes.Green,
                (float)e.PageBounds.Width / 2 - e.Graphics.MeasureString(s, strFont).Width / 2,
                (float)e.PageBounds.Height / 2 - e.Graphics.MeasureString(s, strFont).Height  / 2);
    }

试验结果显示左右是居中的,上下差了3毫米,百思不得其解,
后使用中断大法,运行到此句,发现:
        //在new Font("Arial", 32) 字体下
        //e.Graphics.MeasureString(s, strFont).Height=56.66 
无意中发现:                                                                          
        //strFont.Height=50 
这是为什么?后据此查msdn得到:

            //new Font("Arial", 32) 字体下
            //e.Graphics.MeasureString(s, strFont).Height=56.66  SizeF 相当于SizeF.Height 通常为矩形的宽度和高度,
            //                                                                            也就是返回一个矩形的覆盖区域
            //strFont.Height=50                                    int 此字体的行距(以像素为单位)。
            //行距是两个连续文本行的基线之间的垂直距离。因此,行距包括行间的空白空间及字符本身的高度。详情查阅:Font.Height 属性
            //结论:字符的默认覆盖区域的高度比行距还大
            //注意:上面获得的宽度也是有细微差别的,准确地要使用格式信息,详情查阅:Graphics.MeasureString 方法 (String, Font)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值