You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 02:45:55