C#打印时获得字符串的正确像素宽度高度

来源:互联网 发布:赵本山网络直播视频 编辑:程序博客网 时间:2024/04/29 08:17

转自:http://blog.csdn.net/yourredsun/archive/2008/01/11/2037330.aspx

 


页面长宽属性:
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)