Ecco un'altra soluzione al problema, è un po 'intensa in quanto richiede un bel po' di creazione del carattere e della distruzione, ma può funzionare meglio, a seconda delle circostanze e le esigenze:
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);
}
}
Per utilizzarlo è sufficiente crea una nuova classe e chiama Render(). Nota questo è specificamente scritto per il rendering in un modulo.
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);
È necessario creare l'oggetto in anticipo RenderInBox grazie alla sua intensa la natura della creazione. Pertanto non è adatto ad ogni esigenza.
È possibile applicare una trasformazione matrix, ma sono passati anni dall'ultima volta che l'ho toccato. – leppie
Non è un po 'sovraccarico? – Nissim