Đây là một giải pháp cho vấn đề này, đó là một chút chiều sâu vì nó đòi hỏi một chút công bằng của tạo phông chữ và hủy diệt, nhưng có thể làm việc tốt hơn, tùy thuộc vào hoàn cảnh của bạn và nhu cầu:
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);
}
}
Để sử dụng một cách đơn giản tạo một lớp mới và gọi Render(). Lưu ý điều này được viết cụ thể để hiển thị biểu mẫu.
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);
Bạn nên tạo đối tượng RenderInBox trả trước do tính chất sáng tạo chuyên sâu của nó. Do đó nó không thích hợp cho mọi nhu cầu.
Bạn có thể áp dụng biến đổi ma trận, nhưng đã nhiều năm kể từ lần cuối tôi chạm vào đó. – leppie
Không phải là một chút chi phí? – Nissim