2015-04-29 61 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應該工作一樣好..

相關問題