Solución:
Me gustaría agregar otro voto para el objeto StringFormat. Puede usar esto simplemente para especificar “centro, centro” y el texto se dibujará centralmente en el rectángulo o los puntos proporcionados:
StringFormat format = new StringFormat();
format.LineAlignment = StringAlignment.Center;
format.Alignment = StringAlignment.Center;
Sin embargo, hay un problema con esto en CF. Si usa Centro para ambos valores, desactiva TextWrapping. No tengo idea de por qué sucede esto, parece ser un error con el CF.
Para alinear un texto, utilice lo siguiente:
StringFormat sf = new StringFormat();
sf.LineAlignment = StringAlignment.Center;
sf.Alignment = StringAlignment.Center;
e.Graphics.DrawString("My String", this.Font, Brushes.Black, ClientRectangle, sf);
Tenga en cuenta que el texto aquí está alineado en los límites dados. En este ejemplo, este es ClientRectangle.
A través de una combinación de las sugerencias que recibí, se me ocurrió esto:
private void DrawLetter()
{
Graphics g = this.CreateGraphics();
float width = ((float)this.ClientRectangle.Width);
float height = ((float)this.ClientRectangle.Width);
float emSize = height;
Font font = new Font(FontFamily.GenericSansSerif, emSize, FontStyle.Regular);
font = FindBestFitFont(g, letter.ToString(), font, this.ClientRectangle.Size);
SizeF size = g.MeasureString(letter.ToString(), font);
g.DrawString(letter, font, new SolidBrush(Color.Black), (width-size.Width)/2, 0);
}
private Font FindBestFitFont(Graphics g, String text, Font font, Size proposedSize)
{
// Compute actual size, shrink if needed
while (true)
{
SizeF size = g.MeasureString(text, font);
// It fits, back out
if (size.Height <= proposedSize.Height &&
size.Width <= proposedSize.Width) { return font; }
// Try a smaller font (90% of old size)
Font oldFont = font;
font = new Font(font.Name, (float)(font.Size * .9), font.Style);
oldFont.Dispose();
}
}
Hasta ahora, esto funciona a la perfección.
Lo único que cambiaría es mover la llamada FindBestFitFont () al evento OnResize () para que no lo llame cada vez que dibuje una letra. Solo es necesario llamarlo cuando cambia el tamaño del control. Simplemente lo incluí en la función para completarlo.