2009-06-16 19 views
38

मैं अपने फ़ॉन्ट के लिए इकाई के रूप में पिक्सल का उपयोग कर रहा हूं। एक स्थान पर, मैं यह जांचने के लिए हिट टेस्ट कर रहा हूं कि उपयोगकर्ता ने स्क्रीन पर कुछ टेक्स्ट के बाउंडिंग आयत के भीतर क्लिक किया है या नहीं। इसके लिए मुझे MeasureString जैसे कुछ उपयोग करने की आवश्यकता है। दुर्भाग्यवश, हिट टेस्ट करने वाला कोड लाइब्रेरी के भीतर गहरा है जिसके पास Graphics ऑब्जेक्ट या यहां तक ​​कि Control तक पहुंच नहीं है।ग्राफ़िक्स ऑब्जेक्ट का उपयोग किये बिना स्ट्रिंग को मापें?

Graphics कक्षा का उपयोग किये बिना फ़ॉन्ट को दिए गए स्ट्रिंग के बाउंडिंग बॉक्स को मैं कैसे प्राप्त करूं? मेरा फ़ॉन्ट पिक्सेल में होने पर मुझे Graphics ऑब्जेक्ट की आवश्यकता क्यों है?

+0

यदि आपके पास नियंत्रण नहीं है तो आपके पास क्या है? मैं फ़ॉन्ट और स्ट्रिंग मान रहा हूँ, लेकिन क्या कुछ और है? – micahtan

+0

और कुछ नहीं। मेरी लाइब्रेरी एक प्रकार का दृश्य है। मैं सिस्टम पर निर्भरताओं से बचने की कोशिश कर रहा हूं। ड्रॉइंग और सिस्टम। विन्डोज़.फॉर्म –

उत्तर

44

यदि आपके पास System.Windows.Forms का संदर्भ है, तो TextRenderer क्लास का उपयोग करने का प्रयास करें। एक स्थिर विधि (MeasureText) है जो स्ट्रिंग और फ़ॉन्ट लेती है और आकार देता है। MSDN Link

+2

टेक्स्ट रेन्डरर के साथ थोड़ा समस्या यह है कि यह रिटर्न वैल्यू के लिए पूर्णांक का उपयोग करता है, जो आपको उप-पिक्सेल परिशुद्धता की आवश्यकता होने पर समस्याएं पैदा कर सकता है। अन्यथा, यह एक अच्छा विकल्प है। –

+0

यह समाधान कैसे है? लिंक में उदाहरण 'TextRenderer.DrawText (e.Graphics, ' – jp2code

+0

@ jp2code - क्या आपने मेरा जवाब भी पढ़ा है? उन्होंने पूछा कि ग्राफिक्स क्लास का उपयोग किए बिना स्ट्रिंग को मापने के लिए कैसे कहा गया। मैंने TextRenderer क्लास पर MeasureText विधि का सुझाव दिया। यह उनके प्रश्न का उत्तर देता है और मैंने इस कक्षा के लिए एमएसडीएन दस्तावेज को भी लिंक प्रदान किया है। एक और नजर डालें। – Jarrod

23

आपको ग्राफिक्स ऑब्जेक्ट का उपयोग करने की आवश्यकता नहीं है जिसे आप मापने के लिए उपयोग करने के लिए उपयोग कर रहे हैं।

public static class GraphicsHelper 
{ 
    public static SizeF MeasureString(string s, Font font) 
    { 
     SizeF result; 
     using (var image = new Bitmap(1, 1)) 
     { 
      using (var g = Graphics.FromImage(image)) 
      { 
       result = g.MeasureString(s, font); 
      } 
     } 

     return result; 
    } 
} 

यह worthwile हो सकता है और साथ ही बिटमैप के डीपीआई स्थापित करने के लिए अपनी स्थिति पर निर्भर करता है: आप एक स्थिर उपयोगिता वर्ग बना सकते हैं।

+0

अच्छा लगता है, लेकिन मुझे नहीं लगता कि नया बिटमैप (0, 0) की अनुमति है, शायद (1,1) –

+0

@AlexanderN मैंने अभी पुष्टि की है कि बिटमैप (0, 0) अमान्य है। बिटमैप का आपका समाधान (1, 1) सही है। –

+0

छवि ऑब्जेक्ट प्रत्येक बार – dlopezgonzalez

10

MeasureString @NerdFury उत्तर में विधि अपेक्षा से अधिक स्ट्रिंग चौड़ाई देगी। अतिरिक्त जानकारी आपको here मिल सकती है। आप केवल शारीरिक लंबाई मापने के लिए चाहते हैं, तो इस दो लाइनों जोड़ें:

g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias; 
result = 
    g.MeasureString(measuredString, font, int.MaxValue, StringFormat.GenericTypographic); 
1

यह उदाहरण FormattedText के उपयोग को दर्शाता हुआ के महान काम करता है। FormattedText विंडोज प्रेजेंटेशन फाउंडेशन (डब्ल्यूपीएफ) अनुप्रयोगों में टेक्स्ट ड्राइंग के लिए निम्न-स्तरीय नियंत्रण प्रदान करता है। आप ग्राफ़िक्स ऑब्जेक्ट का उपयोग किये बिना किसी विशेष फ़ॉन्ट के साथ स्ट्रिंग की चौड़ाई को मापने के लिए इसका उपयोग कर सकते हैं।

public static float Measure(string text, string fontFamily, float emSize) 
{ 
    FormattedText formatted = new FormattedText(
     item, 
     CultureInfo.CurrentCulture, 
     System.Windows.FlowDirection.LeftToRight, 
     new Typeface(fontFamily), 
     emSize, 
     Brushes.Black); 

    return formatted.Width; 
} 

विंडोजबेस और प्रेजेंटेशन कोर पुस्तकालयों को शामिल करें।

0

यह दूसरों की दोहराना नहीं हो सकता है, लेकिन मेरी समस्या अवांछित ग्राफिक्स ऑब्जेक्ट भी थी। ऊपर कुंठाओं को सुनने के बाद मैं बस की कोशिश की:

Size proposedSize = new Size(int.MaxValue, int.MaxValue); 
TextFormatFlags flags = TextFormatFlags.NoPadding; 
Size ressize = TextRenderer.MeasureText(content, cardfont, proposedSize, flags); 

... और भाग्य में था (जहां 'सामग्री' स्ट्रिंग को मापने और उस में है फॉन्ट cardfont है)। मैं वीएसटीओ में अपने कॉलम की चौड़ाई निर्धारित करने के लिए परिणाम का उपयोग कर सकता था।

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

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