5

Windows 窗体:

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

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

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

4

4 回答 4

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));
}
于 2008-11-21T13:59:06.570 回答
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;
于 2008-11-21T14:20:05.217 回答
3

棘手,因为您也应该使用字符频率。如果您曾经看过芬兰语及其所有的“i”和“l”,您会意识到即使是纯 ASCII 字体也没有明确定义的平均字符宽度。

于 2008-11-21T14:24:56.877 回答
1

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

于 2008-11-21T13:59:24.213 回答