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

时间:2008-11-21 13:56:17

标签: .net fonts

Windows窗体:

对于System.Drawing,有一种方法可以获得字体高度。

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

但是如何获得平均字符宽度等其他文本指标?

5 个答案:

答案 0 :(得分:4)

使用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));
}

答案 1 :(得分:4)

字体的平均宽度并不严格,因为字距调整可能会产生影响,具体取决于任何给定字母前后的字母。

如果您想要在固定宽度场景中使用非固定大小的字体,您的主要选项是将字符与大写字母“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;

答案 2 :(得分:3)

整蛊,因为你也应该使用角色频率。如果你曾经见过芬兰语及其所有“i”和“l”,你会发现即使是纯ASCII字体也没有明确定义的平均字符宽度。

答案 3 :(得分:1)

查看我对类似问题的回答here

我猜你必须在每个角色上使用它并自己计算平均值

答案 4 :(得分:1)

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