代码之家  ›  专栏  ›  技术社区  ›  P a u l

dotnet:如何获得字体的平均字符宽度?

  •  5
  • P a u l  · 技术社区  · 16 年前

    Windows窗体:

    为了 System.Drawing 有一种方法可以获得字体高度。

    Font font = new Font("Arial", 10 , FontStyle.Regular);
    float fontHeight = font.GetHeight(); 
    

    但是,如何获得其他文本度量,如平均字符宽度?

    5 回复  |  直到 11 年前
        1
  •  4
  •   Ramesh Soni    16 年前

    使用graphics.measurestring方法

    private void MeasureStringMin(PaintEventArgs e)
    {
    
        // Set up string.
        string measureString = "Measure String";
        Font stringFont = new Font("Arial", 16);
    
        // Measure string.
        SizeF stringSize = new SizeF();
        stringSize = e.Graphics.MeasureString(measureString, stringFont);
    
        // Draw rectangle representing size of string.
        e.Graphics.DrawRectangle(new Pen(Color.Red, 1), 0.0F, 0.0F, stringSize.Width, stringSize.Height);
    
        // Draw string to screen.
        e.Graphics.DrawString(measureString, stringFont, Brushes.Black, new PointF(0, 0));
    }
    
        2
  •  4
  •   Ray Hayes    16 年前

    字体没有严格的平均宽度,因为字距调整可以根据任何给定字母前后的字母产生影响。

    如果要在固定宽度方案中使用非固定大小的字体,主要选项是按大写“w”字符的宽度分隔字符。

    其他人已经给出了一个获取指定字符串宽度的示例,但要回答您的问题,要获取可打印字符的真实平均值,您可能需要执行以下操作:

    StringBuilder sb = new StringBuilder();
    
    // Using the typical printable range
    for(char i=32;i<127;i++)
    {
        sb.Append(i);
    } 
    
    string printableChars = sb.ToString();
    
    // Choose your font
    Font stringFont = new Font("Arial", 16);
    
    // Now pass printableChars into MeasureString
    SizeF stringSize = new SizeF();
    stringSize = e.Graphics.MeasureString(printableChars, stringFont);
    
    // Work out average width of printable characters
    double average = stringSize.Width / (double) printableChars.Length;
    
        3
  •  2
  •   MSalters    16 年前

    很棘手,因为你也应该使用字符频率。如果你见过芬兰语,它的“i”和“l”都有,你会发现即使是纯ASCII字体也没有定义好的平均字符宽度。

        4
  •  1
  •   Community CDub    8 年前

    看我对类似问题的回答 here

    我想你应该在每个角色上都用到这个,然后自己计算平均值

        5
  •  1
  •   MusiGenesis    16 年前

    我从未在.NET中看到过平均字符宽度属性。可以使用graphics.measurestring或textrenderer.measurestring获取特定字体中特定字符串的宽度。