如何使用TextRenderer绘制对齐的多种尺寸的文本?
How to draw text of multiple sizes aligned on line with TextRenderer?
我有一个 类 数组,其中包含一些文本和一种字体。我想根据字体大小独立绘制在线对齐的所有文本。我以为我可以从行的 Y 位置减去字体高度并在新位置绘制文本,但这有点困难,因为 GDI 添加到文本的顶部和底部填充。计算正确,但文本漂浮在它应该位于的矩形中间的某个位置。我还发现我可以将 TextFormatFlags
设置为 NoPadding
但这仅有助于左右填充和文字仍然漂浮在线条上方。我一直在寻找一种方法来摆脱所有填充,但我没有找到任何可以做到这一点的方法。
这是我的代码:
public static void DrawTextOnLine(string text, Font font, Graphics graphics, Color color, int x, int dLineY)
{
float upperY = dLineY - GetFontAscent(font);
Point point = new Point(x, (int)upperY);
TextRenderer.DrawText(graphics, text, font, point, color, TextFormatFlags.NoPadding);
}
有一件事我忘了提:我还尝试将 TextFormatFlags
设置为 Bottom
。这样做的问题是降序字母导致文本在线上方。
是否有更简单的方法或如何删除所有填充?
donald 评论中的 Link 指向 dar7yl 的出色回答,说得恰到好处。
dar7yl 的所有荣誉! 下面是示例和结果,很好地排列在同一行上:
private void Form1_Load(object sender, EventArgs e)
{
using (Graphics G = panel2.CreateGraphics() )
{
fonts.Add(new DrawFont(G, new FontFamily("Arial"), 7f));
fonts.Add(new DrawFont(G, new FontFamily("Arial"), 12f));
fonts.Add(new DrawFont(G, new FontFamily("Arial"), 17f));
fonts.Add(new DrawFont(G, new FontFamily("Consolas"), 8f));
fonts.Add(new DrawFont(G, new FontFamily("Consolas"), 10f));
fonts.Add(new DrawFont(G, new FontFamily("Consolas"), 14f));
fonts.Add(new DrawFont(G, new FontFamily("Times"), 9f));
fonts.Add(new DrawFont(G, new FontFamily("Times"), 12f));
fonts.Add(new DrawFont(G, new FontFamily("Times"), 20f));
fonts.Add(new DrawFont(G, new FontFamily("Segoe Print"), 6f));
fonts.Add(new DrawFont(G, new FontFamily("Segoe Print"), 12f));
fonts.Add(new DrawFont(G, new FontFamily("Segoe Print"), 24f));
}
}
List<DrawFont> fonts = new List<DrawFont>();
class DrawFont
{
public Font Font { get; set; }
public float baseLine { get; set; }
public DrawFont(Graphics G, FontFamily FF, float height, FontStyle style)
{
Font = new Font(FF, height, style);
float lineSpace = FF.GetLineSpacing(Font.Style);
float ascent = FF.GetCellAscent(Font.Style);
baseLine = Font.GetHeight(G) * ascent / lineSpace;
}
}
private void panel2_Paint(object sender, PaintEventArgs e)
{
float x = 5f;
foreach ( DrawFont font in fonts )
{
e.Graphics.DrawString("Fy", font.Font, Brushes.DarkSlateBlue, x, 80 - font.baseLine);
x += 50;
}
e.Graphics.DrawLine(Pens.LightSlateGray, 0, 80, 999, 80);
}
我使用 Graphics.DrawString
,但 TextRenderer
应该也能正常工作..
我有一个 类 数组,其中包含一些文本和一种字体。我想根据字体大小独立绘制在线对齐的所有文本。我以为我可以从行的 Y 位置减去字体高度并在新位置绘制文本,但这有点困难,因为 GDI 添加到文本的顶部和底部填充。计算正确,但文本漂浮在它应该位于的矩形中间的某个位置。我还发现我可以将 TextFormatFlags
设置为 NoPadding
但这仅有助于左右填充和文字仍然漂浮在线条上方。我一直在寻找一种方法来摆脱所有填充,但我没有找到任何可以做到这一点的方法。
这是我的代码:
public static void DrawTextOnLine(string text, Font font, Graphics graphics, Color color, int x, int dLineY)
{
float upperY = dLineY - GetFontAscent(font);
Point point = new Point(x, (int)upperY);
TextRenderer.DrawText(graphics, text, font, point, color, TextFormatFlags.NoPadding);
}
有一件事我忘了提:我还尝试将 TextFormatFlags
设置为 Bottom
。这样做的问题是降序字母导致文本在线上方。
是否有更简单的方法或如何删除所有填充?
donald 评论中的 Link 指向 dar7yl 的出色回答,说得恰到好处。
dar7yl 的所有荣誉! 下面是示例和结果,很好地排列在同一行上:
private void Form1_Load(object sender, EventArgs e)
{
using (Graphics G = panel2.CreateGraphics() )
{
fonts.Add(new DrawFont(G, new FontFamily("Arial"), 7f));
fonts.Add(new DrawFont(G, new FontFamily("Arial"), 12f));
fonts.Add(new DrawFont(G, new FontFamily("Arial"), 17f));
fonts.Add(new DrawFont(G, new FontFamily("Consolas"), 8f));
fonts.Add(new DrawFont(G, new FontFamily("Consolas"), 10f));
fonts.Add(new DrawFont(G, new FontFamily("Consolas"), 14f));
fonts.Add(new DrawFont(G, new FontFamily("Times"), 9f));
fonts.Add(new DrawFont(G, new FontFamily("Times"), 12f));
fonts.Add(new DrawFont(G, new FontFamily("Times"), 20f));
fonts.Add(new DrawFont(G, new FontFamily("Segoe Print"), 6f));
fonts.Add(new DrawFont(G, new FontFamily("Segoe Print"), 12f));
fonts.Add(new DrawFont(G, new FontFamily("Segoe Print"), 24f));
}
}
List<DrawFont> fonts = new List<DrawFont>();
class DrawFont
{
public Font Font { get; set; }
public float baseLine { get; set; }
public DrawFont(Graphics G, FontFamily FF, float height, FontStyle style)
{
Font = new Font(FF, height, style);
float lineSpace = FF.GetLineSpacing(Font.Style);
float ascent = FF.GetCellAscent(Font.Style);
baseLine = Font.GetHeight(G) * ascent / lineSpace;
}
}
private void panel2_Paint(object sender, PaintEventArgs e)
{
float x = 5f;
foreach ( DrawFont font in fonts )
{
e.Graphics.DrawString("Fy", font.Font, Brushes.DarkSlateBlue, x, 80 - font.baseLine);
x += 50;
}
e.Graphics.DrawLine(Pens.LightSlateGray, 0, 80, 999, 80);
}
我使用 Graphics.DrawString
,但 TextRenderer
应该也能正常工作..