如何使用 TextRenderer 绘制多种大小的文本对齐? [复制]

Posted

技术标签:

【中文标题】如何使用 TextRenderer 绘制多种大小的文本对齐? [复制]【英文标题】:How to draw text of multiple sizes aligned on line with TextRenderer? [duplicate] 【发布时间】:2015-07-09 02:16:39 【问题描述】:

我有一个包含一些文本和字体的类数组。我想根据字体大小绘制所有在线对齐的文本。我以为我可以从行的 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。这样做的问题是降序字母导致文本高于行。

有没有更简单的方法或者如何删除所有的填充?

【问题讨论】:

如果您发布了一张您看到的与您想要的对比的图片,这可能会有所帮助。通常,如果您对齐“底部”,则所有文本的底部,无论大小如何,都与字母的底部对齐(不包括下降) 您可能会发现这个问题的答案很有用:***.com/questions/1006069/… 【参考方案1】:

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 应该也能正常工作..

【讨论】:

以上是关于如何使用 TextRenderer 绘制多种大小的文本对齐? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

TextRenderer:如何像在具有不同 Dpi 的机器上一样测量文本?

Android - 可绘制形状样式中的多种颜色和大小

LinkLabel 需要比 TextRenderer.MeasureText 更多的空间说

C#Winforms RichTextBox。如何按rtb的大小限制字符数?

如何更改使用 Matplotlib 绘制的图形的大小?

一个函数实现基因内具有多种突变类型的热图的绘制