ग्राफिक्स से केंद्र टेक्स्ट आउटपुट। ड्रॉस्ट्रिंग ()

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

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

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

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

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);

हां, मुझे पता है कि लेबल नियंत्रण है जिसका मैं उपयोग कर सकता हूं और उसके साथ केंद्र स्थापित कर सकता हूं, लेकिन मुझे वास्तव में इसे ग्राफिक्स वर्ग के साथ मैन्युअल रूप से करने की आवश्यकता है।

0
ro fr bn

6 उत्तर

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

ग्राफिक्स.ड्रास्ट्रिंग विधि और स्ट्रिंगफॉर्मैट क्लास

0
जोड़ा

मुझे मिलने वाले सुझावों के संयोजन के माध्यम से, मैं इसके साथ आया:

    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() कॉल को OnResize() ईवेंट पर ले जाना है ताकि जब भी मैं एक पत्र खींचूं, मैं इसे कॉल नहीं कर रहा हूं। जब नियंत्रण आकार बदलता है तो इसे केवल कॉल करने की आवश्यकता होती है। मैंने इसे पूरी तरह से पूर्णता के लिए समारोह में शामिल किया।

0
जोड़ा

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

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

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

0
जोड़ा

यहां कुछ कोड है। यह मानता है कि आप इसे किसी फॉर्म, या 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));

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

0
जोड़ा

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

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, स्रोत

एक केंद्रित पाठ आकर्षित करने के लिए:

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

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

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
जोड़ा