2012-03-02 20 views
17

मेरे पास एक लेबल है जो फ़ाइल नाम दिखाता है .. मुझे लेबल के AutoSize को False पर डिज़ाइनिंग के लिए सेट करना पड़ा था।
तो जब फ़ाइल नाम टेक्स्ट लेबल आकार से अधिक लंबा हो गया .. यह तस्वीर में कट गया।लेबल के आकार से अधिक लंबा होने पर लेबल के टेक्स्ट आकार का आकार बदलें?

enter image description here

label1.Size = new Size(200, 32); 
label1.AutoSize = false; 

मैं फिर से आकार है कैसे पाठ स्वचालित रूप से, लेबल के आकार के अनुसार जब पाठ लेबल आकार से बड़ी हो?

+0

आपको क्या होने की उम्मीद पाठ लंबे समय तक हो जाता है तो क्या फॉर्म पर प्रदर्शित करने के लिए? –

+0

कृपया जीयूआई फ्रेमवर्क, विनफॉर्म या एएसपीनेट या अन्य के लिए टैग सेट करें। – brgerner

+1

@ एम। बाबॉक मुझे उम्मीद है कि यह छोटा हो जाएगा ताकि यह –

उत्तर

23

आप नीचे मेरे कोड स्निपेट का उपयोग कर सकते हैं। टेक्स्ट आकार के आधार पर लेबल के फ़ॉन्ट की गणना करने के लिए सिस्टम को कुछ लूप की आवश्यकता होती है।

while(label1.Width < System.Windows.Forms.TextRenderer.MeasureText(label1.Text, 
    new Font(label1.Font.FontFamily, label1.Font.Size, label1.Font.Style)).Width) 
{ 
    label1.Font = new Font(label1.Font.FontFamily, label1.Font.Size - 0.5f, label1.Font.Style); 
} 
+4

लेबल को फिट कर सके। लेबल के बड़े होने पर आपको कोड जोड़ने की आवश्यकता है और फ़ॉन्ट को आकार में वृद्धि की आवश्यकता है। – gonzobrains

+0

लूपिंग एक अच्छा आकार खोजने के लिए एक अक्षम तरीका है। [jwaliszko का जवाब] (https://stackoverflow.com/a/20457976/199364) या [Andro72 का उत्तर] (https://stackoverflow.com/a/25448687/199364) लूपिंग से बचें, एक बार मापकर और अनुपात की गणना करके । यदि 'ग्राफिक्स' उपलब्ध नहीं है, तो मुझे 'TextRenderer.MeasureText' के उपयोग की तरह लगता है। और इस तरह के कुछ ऐसा करने के लिए बुद्धिमान हो सकता है ** ** उन अन्य उत्तरों में से एक के बाद, यदि अनुपात गणना थोड़ा बहुत बड़े लेबल में होती है। – ToolmakerSteve

5

article @brgerner द्वारा प्रदान के आधार पर, मैं वैकल्पिक कार्यान्वयन यहाँ प्रदान करेंगे, के रूप में है कि एक के रूप में चिह्नित एक जवाब इतनी कुशल है और न ही नीचे इस एक के रूप में पूरा नहीं हुआ है:

public class FontWizard 
{ 
    public static Font FlexFont(Graphics g, float minFontSize, float maxFontSize, Size layoutSize, string s, Font f, out SizeF extent) 
    { 
     if (maxFontSize == minFontSize) 
      f = new Font(f.FontFamily, minFontSize, f.Style); 

     extent = g.MeasureString(s, f); 

     if (maxFontSize <= minFontSize) 
      return f; 

     float hRatio = layoutSize.Height/extent.Height; 
     float wRatio = layoutSize.Width/extent.Width; 
     float ratio = (hRatio < wRatio) ? hRatio : wRatio; 

     float newSize = f.Size * ratio; 

     if (newSize < minFontSize) 
      newSize = minFontSize; 
     else if (newSize > maxFontSize) 
      newSize = maxFontSize; 

     f = new Font(f.FontFamily, newSize, f.Style); 
     extent = g.MeasureString(s, f); 

     return f; 
    } 

    public static void OnPaint(object sender, PaintEventArgs e, string text) 
    { 
     var control = sender as Control; 
     if (control == null) 
      return; 

     control.Text = string.Empty; //delete old stuff 
     var rectangle = control.ClientRectangle; 

     using (Font f = new System.Drawing.Font("Microsoft Sans Serif", 20.25f, FontStyle.Bold)) 
     { 
      SizeF size; 
      using (Font f2 = FontWizard.FlexFont(e.Graphics, 5, 50, rectangle.Size, text, f, out size)) 
      { 
       PointF p = new PointF((rectangle.Width - size.Width)/2, (rectangle.Height - size.Height)/2); 
       e.Graphics.DrawString(text, f2, Brushes.Black, p); 
      } 
     } 
    } 
} 

और उपयोग:

val label = new Label(); 
label.Paint += (sender, e) => FontWizard.OnPaint(sender, e, text); 
6

लेबल स्केलिंग

private void scaleFont(Label lab) 
    { 
     Image fakeImage = new Bitmap(1, 1); //As we cannot use CreateGraphics() in a class library, so the fake image is used to load the Graphics. 
     Graphics graphics = Graphics.FromImage(fakeImage); 


     SizeF extent = graphics.MeasureString(lab.Text, lab.Font); 


     float hRatio = lab.Height/extent.Height; 
     float wRatio = lab.Width/extent.Width; 
     float ratio = (hRatio < wRatio) ? hRatio : wRatio; 

     float newSize = lab.Font.Size * ratio; 



     lab.Font = new Font(lab.Font.FontFamily, newSize, lab.Font.Style); 

    } 
+0

'windows.Forms.TextRenderer.MeasureText' का उपयोग कर सकता है; 'नकली छवि' या 'ग्राफिक्स' की आवश्यकता नहीं होगी। – ToolmakerSteve

-1
private void setFontSize(Label label1) 
    { 
     if (label1.Text.Length > 200) 
     { 
      label1.Font = new Font(label1.Font.FontFamily, 24f, label1.Font.Style); 
     } 
     else if (label1.Text.Length > 100) 
     { 
      label1.Font= new Font(label1.Font.FontFamily, 36f, label1.Font.Style); 
     }else 
      label1.Font = new Font(label1.Font.FontFamily, 48f, label1.Font.Style);//My orginal font size is 48f. 
    } 

आप खुद के लिए संपादित कर सकते हैं।

private void button1_Click(object sender, EventArgs e) 
{ 
    Panel.Text = "Your Text"; 
    setFontSize(Panel); 
} 
+3

भविष्य में, कृपया अपने उत्तर के लिए कुछ स्पष्टीकरण दें। –

+0

यह एक कमजोर जवाब है। बहुत बेहतर उत्तर पहले से मौजूद हैं .. – ToolmakerSteve

0

मैं निम्नलिखित भारित स्केलिंग चाल का उपयोग एक अच्छा फिट है, यानी एक भारित दुविधा यह ऊंचाई फिटिंग और चौड़ाई फिटिंग बीच किया जाता है प्रदान करते हैं। यह वीबी नेट में है, लेकिन मुझे लगता है कि आप आसानी से सी # में अनुवाद कर सकते हैं।

Function shrinkFontToFit(f As Font, text As String, requiredsize As SizeF) As Font 
    Dim actualsize As SizeF = TextRenderer.MeasureText(text, f) 
    Return New Font(f.FontFamily, f.Size * (requiredsize.Width + requiredsize.Height) _ 
     /(actualsize.Width + actualsize.Height), f.Style, GraphicsUnit.Pixel) 
End Function 
+0

कृपया बताएं कि * भारित * स्केलिंग उचित/उपयोगी होगी। सबसे आम उपयोग के लिए, आकार को तब तक छोटा होना चाहिए जब तक पाठ * दोनों * आयाम फिट न हो; जब कोई यहां दृष्टिकोण का उपयोग करना चाहेगा? – ToolmakerSteve

-1

मुझे लगता है कि सबसे आसान तरीका आकार प्रस्तुत करना जाँच करने के लिए और अगर यह वास्तविक लेबल आकार से अधिक है, लेबल के fontsize कमी हो सकती है।

निजी शून्य label3_Paint (वस्तु प्रेषक, PaintEventArgs ई) {

 Size sz = TextRenderer.MeasureText(label1.Text, label1.Font, label1.Size, TextFormatFlags.WordBreak); 

     if (sz.Width > label1.Size.Width || sz.Height > label1.Size.Height) 
     { 

      DecreaseFontSize(label1); 

     } 
    } 

सार्वजनिक शून्य DecreaseFontSize (लेबल LbL) {

 lbl.Font = new System.Drawing.Font(lbl.Font.Name, lbl.Font.Size - 1, lbl.Font.Style); 

    } 
+0

** क्या आपने पहले से मौजूद किसी भी मौजूदा उत्तर को पढ़ा है, यह देखने के लिए कि क्या वे कुछ ऐसा करते हैं ?? [संकेत: समान उत्तर हैं, और वे एक बेहतर काम करते हैं, क्योंकि वे एक फिट मिलने तक परीक्षण * दोहराते हैं, या इससे भी बेहतर, वे अनुमान लगाते हैं * एक बार मापने के बाद कौन सा आकार फिट होगा।] – ToolmakerSteve

संबंधित मुद्दे