यहाँ समस्या का एक समाधान है, यह एक छोटे से गहन है के रूप में यह फॉन्ट निर्माण और विनाश का एक उचित बिट की आवश्यकता है, लेकिन अपने परिस्थितियों के आधार पर बेहतर कार्य कर सकता है, और की जरूरत है:
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);
}
}
यह बस का उपयोग करने के एक नई कक्षा बनाएं और रेंडर कॉल करें()। ध्यान दें कि यह विशेष रूप से किसी फ़ॉर्म को प्रस्तुत करने के लिए लिखा गया है।
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);
आप RenderInBox वस्तु अग्रिम की वजह से यह गहन निर्माण स्वभाव है बनाना चाहिए। इसलिए यह हर जरूरत के लिए उपयुक्त नहीं है।
आप एक मैट्रिक्स ट्रांसफॉर्म लागू कर सकते हैं, लेकिन पिछले कुछ वर्षों से मैंने इसे छुआ है। – leppie
क्या यह ओवरहेड का थोड़ा सा नहीं है? – Nissim