У меня есть пользовательский элемент управления, который в будущем может иметь настраиваемый пользователем шрифт (масштабирование уже реализовано). Я должен заполнить прямоугольник двумя цифрами, которые образуют число base-10. У меня есть разные цвета для нуля, одной или обеих цифр.
со шрифтом {Name = Microsoft Sans Serif
Size = 16
} и следующими Graphics.MeasureString
вызовами метода:
g.MeasureString("00", Font);
g.MeasureString("0", Font);
Я получаю:
- Размер "00" равен {Ширина =
31.5486088
Высота = 26.8124962
}
- Размер "0" равен {Ширина =
19.3298588
Высота = 26.8124962
}
Ширина "0" намного больше, чем половина ширины "00".
Я знаю о методах Graphics.MeasureString , у него много перегрузок, и я также знаю о классе StringFormat. Как правильно вычислить ширину символа '0'?
Поскольку шрифт будет настраиваться пользователем, я не хочу решать проблему, используя моноширинный шрифт.
Если я использую следующие звонки:
g.MeasureString("00", Font, 999, StringFormat.GenericTypographic);
g.MeasureString("0", Font, 999, StringFormat.GenericTypographic);
Ширина "0", по-видимому, равна половине ширины "00", но цифры перекрываются при рисовании с меньшим размером шрифта:
![screenshot](https://i.stack.imgur.com/QTJTK.png)
Обновление: В методе OnPaint UserControl у меня есть этот код:
Graphics g = e.Graphics;
int[] indices = { 0, 1 };
CharacterRange[] charRanges = new CharacterRange[indices.Length];
for (int chx = 0; chx < indices.Length; ++chx)
{
charRanges[chx] = new CharacterRange(indices[chx], 1);
}
StringFormat sf = new StringFormat(StringFormat.GenericDefault);
sf.SetMeasurableCharacterRanges(charRanges);
Region[] regions = e.Graphics.MeasureCharacterRanges("01", Font, e.ClipRectangle, sf);
RectangleF[] r = new RectangleF[regions.Length];
int i = 0;
foreach (Region rr in regions)
{
r[i] = rr.GetBounds(g);
g.DrawRectangle(Pens.Blue, r[i].X, r[i].Y, r[i].Width, r[i].Height);
++i;
}
g.DrawString("0", Font, Brushes.Black, r[0], sf);
g.DrawString("1", Font, Brushes.Black, r[1], sf);
шрифт {Name = "Microsoft Sans Serif" Size=25}
. При запуске программы это то, что видно:
![screenshot 2](https://i.stack.imgur.com/s5T2L.png)
Я хочу сделать цифры центрированными в синих прямоугольниках. Прямоугольники должны быть настолько большими, насколько это возможно в UserControl, но также должны оставлять место для процента от высоты UserControl. Шрифт должен адаптироваться к прямоугольникам.