Con GDI +, ¿cuál es el enfoque más sencillo para alinear texto (dibujado en varias fuentes diferentes) a lo largo de una línea de base común?

Mi problema:

Actualmente estoy trabajando en un control de usuario personalizado que muestra fragmentos de texto (cada uno con una fuente potencialmente diferente) en una línea. Me gustaría alinear todos esos bits de textoexactamente a lo largo de una línea de base común. Por ejemplo:

  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

Como no he encontrado ninguna funcionalidad GDI + para hacer esto directamente, se me ocurrió mi propio método (que se describe a continuación). Sin embargo:

Me pregunto si realmente no hay una manera más fácil de hacer esto.

Mi enfoque actual:

1) Reúne una lista de todosSystem.Drawing.Fonts que se utilizará para dibujar texto.

2) Para cadaFont, encuentre la posición vertical de la línea de base en píxeles, usando el siguiente código:

// 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) Para todosFonts utilizado, determinar el máximobaseLineInPixels valor como se calcula arriba y almacenar este valor paramaxBaseLineInPixels.

4) Dibuja cada bit de texto de la siguiente manera:

// 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);

¿Me estoy perdiendo algo, o realmente no hay forma más fácil?

Respuestas a la pregunta(2)

Su respuesta a la pregunta