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)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章