2015-04-29 43 views
0

我有一个包含一些文本和字体的类的数组。我想要在字体大小上独立绘制所有文字。我认为我可以从行的Y位置减去字体高度并在新位置上绘制文本,但是由于GDI将文本的顶部和底部填充添加到顶部和底部填充中,所以这有点困难。该计算的工作原理是正确的,但文本漂浮在它应该在的矩形中间的某处。我还发现,我可以将TextFormatFlags设置为NoPadding,但这仅对左侧和右侧填充有帮助,并且文本仍悬浮在该行的上方。我一直在寻找一种摆脱所有填充的方法,但我没有找到任何可以做到这一点的方法。 这是我的代码:如何绘制与TextRenderer一致的多个大小的文本?

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。问题在于降序字母导致文本在行上。

有没有更简单的方法来做到这一点或如何删除所有的填充?

+0

这可能是有用的,如果你张贴了你看到的图像,和你想要的图像。通常,如果您对齐到“底部”,则所有文本的底部(不论大小)是否与字母底部对齐(不包括下降) – dodald

+1

另外,您可能会发现此问题的答案很有用:http:// stackoverflow.com/questions/1006069/how-do-i-get-the-position-of-the-text-baseline-in-a-label-and-a-numericupdown – dodald

回答

2

唐纳德的评论中的Link指向dar7yl的出色答案让它恰到好处。

所有的荣誉dar7yl!下面就是一个例子,其结果,很好地排列在同一行:

enter image description here

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应该工作一样好..

相关问题