Используя GDI +, каков самый простой подход для выравнивания текста (нарисованного несколькими различными шрифтами) по общей базовой линии?
В настоящее время я работаю над пользовательским элементом управления, который отображает фрагменты текста (каждый из которых может иметь разный шрифт) в одну строку. Я хотел бы выровнять все эти биты текстаименно так вдоль общей базы. Например:
Hello, I am George.
------------------------------ <- all text aligns to a common baseline
^ ^ ^
| | |
Courier Arial Times <- font used for a particular bit of text
20pt 40pt 30pt
Поскольку я не нашел никакой функциональности GDI +, чтобы сделать это напрямую, я придумал свой собственный метод (обрисованный в общих чертах ниже). Тем не мение:
Интересно, неужели нет более простого способа сделать это?
Мой текущий подход:1) Соберите список всехSystem.Drawing.Font
s, которые будут использоваться для рисования текста.
2) Для каждогоFont
Найдите вертикальную позицию базовой линии в пикселях, используя следующий код:
// variables used in code sample (already set)
Graphics G;
Font font;
...
// compute ratio in order to convert from font design units to pixels:
var designUnitsPerPixel = font.GetHeight(G) /
font.FontFamily.GetLineSpacing(font.Style);
// get the cell ascent (baseline) position in design units:
var cellAscentInDesignUnits = font.FontFamily.GetCellAscent(font.Style);
// finally, convert the baseline position to pixels:
var baseLineInPixels = cellAscentInDesignUnits * designUnitsPerPixel;
3) Для всехFont
с, определить максимальныйbaseLineInPixels
значение, рассчитанное выше, и сохранить это значение вmaxBaseLineInPixels
.
4) Нарисуйте каждый бит текста следующим образом:
// variables used in code sample (already set):
Graphics G;
Font font;
string text;
...
// find out how much space is needed for drawing the text
var measureF = G.MeasureString(text, font);
// determine location where text will be drawn:
var layoutRectF = new RectangleF(new PointF(0f, 0f), measureF);
layoutRectF.Y += maxBaseLineInPixels - baseLineInPixels;
// ^ the latter value 'baseLineInPixels' is specific to the font used
// draw text at specified location
G.DrawString(text, font, Brushed.Black, layoutRectF);
Я что-то упустил или нет более простого способа?