为何使用DrawString绘制字符串时未从(0,0)位置开始?
让DrawString从(0,0)位置开始绘制的解决方法
问题原因
g.DrawString()方法中,你传入的Y坐标是字符串基线的位置,而非字符的左上角。字体设计时,字符会在基线上方(上升段)和下方(下降段)延伸,所以用(0,0)作为基线时,字符的顶部会落在Y负轴区域,视觉上看起来字符串是从(0,0)下方开始绘制的。
解决方案
方案1:通过字体参数计算调整Y坐标
通过获取字体的上升段高度,将Y坐标设置为负的上升段像素值,让字符顶部对齐(0,0):
// 获取当前Graphics的垂直DPI float dpiY = g.DpiY; // 获取字体的上升段设计单位值 float ascent = font.FontFamily.GetCellAscent(font.Style); // 将设计单位转换为像素 float ascentPixels = (ascent * font.SizeInPoints * dpiY) / 72; // 调整Y坐标为负的上升段像素值 g.DrawString("99", font, new SolidBrush(FontColorPnl.BackColor), 0, -ascentPixels);
方案2:使用TextRenderer.DrawText替代
TextRenderer.DrawText()方法默认以指定坐标作为字符区域的左上角,无需额外计算即可直接对齐(0,0):
TextRenderer.DrawText(g, "99", font, new Point(0, 0), FontColorPnl.BackColor);
内容的提问来源于stack exchange,提问作者Davied
相关产品推荐
相关产品推荐

