2008-08-11 9 views
38

मैं .NETCF (विंडोज मोबाइल) Graphics कक्षा और DrawString() विधि का उपयोग स्क्रीन पर एक वर्ण प्रस्तुत करने के लिए कर रहा हूं।ग्राफिक्स से केंद्र टेक्स्ट आउटपुट। ड्रॉस्ट्रिंग()

समस्या यह है कि मैं इसे ठीक से केंद्रित नहीं कर पा रहा हूं। इससे कोई फर्क नहीं पड़ता कि मैंने स्ट्रिंग रेंडर के स्थान के वाई समन्वय के लिए क्या सेट किया है, यह हमेशा उससे कम आता है और पाठ आकार जितना अधिक होगा उतना ही अधिक ऑफसेट होगा।

उदाहरण के लिए, पाठ का आकार 12 पर, ऑफसेट बारे में 4 है, लेकिन 32 ऑफसेट पर के बारे में 10

मैं चरित्र करने के लिए खड़ी आयत के सबसे तक ले उस में तैयार किया जा रहा है और केंद्रित हो चाहता हूँ क्षैतिज। मेरा मूल कोड यहाँ है। this उपयोगकर्ता नियंत्रण यह में तैयार किया जा रहा है संदर्भित कर रहा है।

Graphics g = this.CreateGraphics(); 

float padx = ((float)this.Size.Width) * (0.05F); 
float pady = ((float)this.Size.Height) * (0.05F); 

float width = ((float)this.Size.Width) - 2 * padx; 
float height = ((float)this.Size.Height) - 2 * pady; 

float emSize = height; 

g.DrawString(letter, new Font(FontFamily.GenericSansSerif, emSize, FontStyle.Regular), 
      new SolidBrush(Color.Black), padx, pady); 

हाँ, मैं जानता हूँ कि लेबल नियंत्रण है कि मैं बजाय इस्तेमाल कर सकते हैं और उस के साथ केंद्रित सेट वहाँ है, लेकिन मैं वास्तव में के साथ मैन्युअल रूप से ऐसा करने की जरूरत है Graphics कक्षा।

उत्तर

13

, मैं इस के साथ आया था:

private void DrawLetter() 
    { 
     Graphics g = this.CreateGraphics(); 

     float width = ((float)this.ClientRectangle.Width); 
     float height = ((float)this.ClientRectangle.Width); 

     float emSize = height; 

     Font font = new Font(FontFamily.GenericSansSerif, emSize, FontStyle.Regular); 

     font = FindBestFitFont(g, letter.ToString(), font, this.ClientRectangle.Size); 

     SizeF size = g.MeasureString(letter.ToString(), font); 
     g.DrawString(letter, font, new SolidBrush(Color.Black), (width-size.Width)/2, 0); 

    } 

    private Font FindBestFitFont(Graphics g, String text, Font font, Size proposedSize) 
    { 
     // Compute actual size, shrink if needed 
     while (true) 
     { 
      SizeF size = g.MeasureString(text, font); 

      // It fits, back out 
      if (size.Height <= proposedSize.Height && 
       size.Width <= proposedSize.Width) { return font; } 

      // Try a smaller font (90% of old size) 
      Font oldFont = font; 
      font = new Font(font.Name, (float)(font.Size * .9), font.Style); 
      oldFont.Dispose(); 
     } 
    } 

अब तक, इस दोषरहित काम करता है।

एकमात्र चीज जो मैं बदलूंगा वह FindBestFitFont() कॉल को ऑनरिज() ईवेंट पर ले जाना है ताकि जब भी मैं एक पत्र खींचूं, मैं इसे कॉल नहीं कर रहा हूं। जब नियंत्रण आकार बदलता है तो इसे केवल कॉल करने की आवश्यकता होती है। मैंने इसे पूरी तरह से पूर्णता के लिए समारोह में शामिल किया।

1

आप पाठ को केन्द्रित करने के लिए DrawString विधि में StringFormat ऑब्जेक्ट का एक उदाहरण उपयोग कर सकते हैं।

Graphics.DrawString Method और StringFormat Class देखें।

1

यहां कुछ कोड है। यह मानता है कि आप इसे किसी फॉर्म, या UserControl पर कर रहे हैं।

Graphics g = this.CreateGraphics(); 
SizeF size = g.MeasureString("string to measure"); 

int nLeft = Convert.ToInt32((this.ClientRectangle.Width/2) - (size.Width/2)); 
int nTop = Convert.ToInt32((this.ClientRectangle.Height/2) - (size.Height/2)); 

अपनी पोस्ट से, यह ClientRectangle भाग की तरह लगता है (में, आप इसे उपयोग नहीं कर रहे के रूप में) क्या आप कठिनाई दे रहा है।

TextRenderer.DrawText(g, "my text", Font, Bounds, ForeColor, BackColor, 
    TextFormatFlags.HorizontalCenter | 
    TextFormatFlags.VerticalCenter | 
    TextFormatFlags.GlyphOverhangPadding); 

इष्टतम फ़ॉन्ट आकार का निर्धारण एक क्षेत्र को भरने के लिए एक सा और अधिक कठिन है:

8

एक केंद्रित पाठ आकर्षित करने के लिए। मुझे मिली एक काम करने वाली आत्मा परीक्षण और त्रुटि है: एक बड़े फ़ॉन्ट से शुरू करें, फिर स्ट्रिंग को बार-बार मापें और फ़ॉन्ट फिट होने तक फ़ॉन्ट को कम करें।

Font FindBestFitFont(Graphics g, String text, Font font, 
    Size proposedSize, TextFormatFlags flags) 
{ 
    // Compute actual size, shrink if needed 
    while (true) 
    { 
    Size size = TextRenderer.MeasureText(g, text, font, proposedSize, flags); 

    // It fits, back out 
    if (size.Height <= proposedSize.Height && 
     size.Width <= proposedSize.Width) { return font; } 

    // Try a smaller font (90% of old size) 
    Font oldFont = font; 
    font = new Font(font.FontFamily, (float)(font.Size * .9)); 
    oldFont.Dispose(); 
    } 
} 

आप के रूप में इस का उपयोग करेंगे: सुझाव मुझे मिल माध्यम से एक संयोजन

Font bestFitFont = FindBestFitFont(g, text, someBigFont, sizeToFitIn, flags); 
// Then do your drawing using the bestFitFont 
// Don't forget to dispose the font (if/when needed) 
+0

सामान खींचने का दूसरा तरीका दिखाने के लिए धन्यवाद, यह वास्तव में मुझे केंद्र संरेखण समस्या से बाहर निकलने में मदद करता है TextRenderer.DrawText अधिक सटीक है, तो एक साधारण egraphics.drawstring बहुत धन्यवाद है, मुझसे वोट दें :) –

54

मैं स्ट्रिंगफॉर्मेट ऑब्जेक्ट के लिए एक और वोट जोड़ना चाहता हूं। आप इस बस "सेंटर, सेंटर" निर्दिष्ट करने के लिए उपयोग कर सकते हैं और पाठ आयत में केन्द्र तैयार किया जाएगा या अंक प्रदान की:

StringFormat format = new StringFormat(); 
format.LineAlignment = StringAlignment.Center; 
format.Alignment = StringAlignment.Center; 

लेकिन वहाँ सीएफ़ में इस के साथ एक मुद्दा है यदि आप दोनों मानों के लिए केंद्र का उपयोग करते हैं तो यह TextWrapping बंद कर देता है।कोई विचार नहीं कि ऐसा क्यों होता है, यह सीएफ के साथ एक बग प्रतीत होता है।

40

संरेखित करने के लिए एक पाठ निम्नलिखित का उपयोग करें:

StringFormat sf = new StringFormat(); 
sf.LineAlignment = StringAlignment.Center; 
sf.Alignment = StringAlignment.Center; 
e.Graphics.DrawString("My String", this.Font, Brushes.Black, ClientRectangle, sf); 

कृपया ध्यान दें कि यहां पाठ दिया सीमा में गठबंधन है। इस नमूने में यह क्लाइंटरेक्टंगल है।

+0

क्रिस समाधान बहुत अच्छा है। बीटीडब्ल्यू अगर आप क्षैतिज के केंद्र में सेट करना चाहते हैं, लेकिन किसी भी स्थिति पर लंबवत: ई। ग्राफिक्स। ड्रॉस्ट्रिंग ("मेरा स्ट्रिंग", यह। फॉन्ट, ब्रश। ब्लैक, ई। सेलबॉड्स। विथथ/2, वाई, एसएफ); // y लंबवत स्थिति है – camino

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