Выровняйте EmHeight по центру - PullRequest
       19

Выровняйте EmHeight по центру

0 голосов
/ 05 сентября 2018

Я пытаюсь выровнять текст в верхнем регистре так, чтобы он выглядел вертикально по центру прямоугольника:

var bmp = new Bitmap(size, size); // square bitmap
Font font = new Font("Tahoma", size * 3 / 8); // relative font size looks ok.
Graphics graphics = Graphics.FromImage(bmp);
Rectangle rectangle = new Rectangle(0, 0, size, size); // put font into the bitmap

StringFormat sf = new StringFormat(); // align vertically and horizontally!
sf.Alignment = StringAlignment.Center;
sf.LineAlignment = StringAlignment.Center;
graphics.FillRectangle(new SolidBrush(Color.Gray), rectangle);

graphics.DrawString("MB", font, Brushes.White, rectangle, sf);

Теперь в верхнем регистре обычно не используется спуск, только всплытие (ср. http://csharphelper.com/blog/2014/08/get-font-metrics-in-c/). Выравнивание, однако, выполняется с учетом спуска, поэтому строка смотрит на верх на несколько пикселей.

Поэтому я попытался ввести вертикальное смещение для DrawString, используя класс из ссылки. Однако это не работает, потому что рассчитанные значения кажутся далекими:

FontInfo fontInfo = new FontInfo(graphics, font);
int verticalOffset = (int)Math.Round(fontInfo.DescentPixels);
Rectangle rectangle2 = new Rectangle(0, verticalOffset, size, size);
graphics.DrawString("MB", font, Brushes.White, rectangle2, sf);

Как я могу получить текст, который выглядит вертикально по центру на графике?

...