CSDN博客

img chybaby

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

发表于2008/10/30 21:14:00  2994人阅读

分类: VS.NET

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

相关博文

我的热门文章

img
取 消
img