dotnet: Как получить среднюю ширину символа для шрифта? - PullRequest
5 голосов
/ 21 ноября 2008

Windows Forms:

Для System.Drawing есть способ получить высоту шрифта.

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

Но как вы получаете другие текстовые метрики, такие как средняя ширина символа?

Ответы [ 5 ]

4 голосов
/ 21 ноября 2008

Не существует строго средней ширины для шрифтов, поскольку кернинг может оказывать влияние в зависимости от того, какие буквы находятся до и после любой данной буквы.

Если вы хотите использовать шрифты не фиксированного размера, используемые в сценарии с фиксированной шириной, ваш основной вариант - разместить символы по ширине символа 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;
4 голосов
/ 21 ноября 2008

Использовать метод 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));
}
3 голосов
/ 21 ноября 2008

Хитрый, так как вы должны также использовать частоту символов. Если вы когда-либо видели финский со всеми его i и l, вы поймете, что даже чистый шрифт ASCII не имеет четко определенной средней ширины символа.

1 голос
/ 21 ноября 2008

Я никогда не видел свойства средней ширины символов в .NET. Вы можете получить ширину определенной строки в определенном шрифте, используя Graphics.MeasureString или TextRenderer.MeasureString.

1 голос
/ 21 ноября 2008

Смотрите мой ответ на похожий вопрос здесь

Полагаю, вам придется использовать это для каждого персонажа и самостоятельно рассчитать среднее

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...