Aquí hay otra solución al problema, que es un poco intenso, ya que requiere un poco de creación de la fuente y la destrucción, pero puede funcionar mejor, en función de sus circunstancias y necesidades:
public class RenderInBox
{
Rectangle box;
Form root;
Font font;
string text;
StringFormat format;
public RenderInBox(Rectangle box, Form root, string text, string fontFamily, int startFontSize = 150)
{
this.root = root;
this.box = box;
this.text = text;
Graphics graphics = root.CreateGraphics();
bool fits = false;
int size = startFontSize;
do
{
if (font != null)
font.Dispose();
font = new Font(fontFamily, size, FontStyle.Regular, GraphicsUnit.Pixel);
SizeF stringSize = graphics.MeasureString(text, font, box.Width, format);
fits = (stringSize.Height < box.Height);
size -= 2;
} while (!fits);
graphics.Dispose();
format = new StringFormat()
{
Alignment = StringAlignment.Center,
LineAlignment = StringAlignment.Center
};
}
public void Render(Graphics graphics, Brush brush)
{
graphics.DrawString(text, font, brush, box, format);
}
}
Para usarlo, simplemente crea una nueva clase y llama a Render(). Tenga en cuenta que esto está escrito específicamente para representar en un formulario.
var titleBox = new RenderInBox(new Rectangle(10, 10, 400, 100), thisForm, "This is my text it may be quite long", "Tahoma", 200);
titleBox.Render(myGraphics, Brushes.White);
Debe crear el objeto RenderInBox por adelantado debido a su naturaleza de creación intensiva. Por lo tanto, no es adecuado para todas las necesidades.
Puede aplicar una transformación matricial, pero han pasado años desde la última vez que lo toqué. – leppie
¿No es un poco caro? – Nissim