我需要在一个完全居中,水平和垂直的面板中绘制一个字符串。
使用MeasureString函数水平居中并不是什么大问题。
错误,MeasureString函数返回一个高度,它处理每个可能的char(如P和p),但不是实际字符串的实际高度。
以下是我正在使用的示例代码:
using (Graphics gr = Graphics.FromImage(mBackImage))
{
gr.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
gr.FillRectangle(new SolidBrush(BackColor), new Rectangle(0, 0, this.Width, this.Height));
var f = new Font(Font.FontFamily, this.ClientSize.Height, FontStyle.Bold, GraphicsUnit.Pixel);
var sz = gr.MeasureString(Label, f);
var pt = new PointF((this.ClientSize.Width - sz.Width) / 2, (this.ClientSize.Height - sz.Height) / 2);
gr.DrawString(Label, f, new SolidBrush(ForeColor), pt);
}
我的目标是绘制数字,结果是数字绘制得太高了。
即使我将文本从“10”更改为“P”,也改为“p”,我看到文本在“基线”上保持对齐。
我真的希望将文本置于中心位置,具体取决于真实的足迹。
我怎样才能做到这一点?
注意:这个问题绝对不是“收据打印中心文本”的重复,因为我说的是垂直居中,而不是水平居中。
MeasureString或MeasureCharacterRanges的返回大小比实际打印的字符高,导致垂直对齐问题。