2010-08-25 11 views
5

मैं एक .NET 3.5 विन फॉर्म प्रोग्राम विकसित कर रहा हूं और मैंने टेक्स्ट ड्राइंग के साथ "रोचक" समस्या में भाग लिया है।.net DrawString/StringFormat समस्या

मैं एक टेक्स्ट संपादन नियंत्रण लागू कर रहा हूं और यह DrawString() और StringFormat.GenericTypographic (इसके बाद, जीटी) के साथ पाठ खींचता है। उपयोगकर्ता प्रकार के रूप में, लाइन में पहले पूरे शब्द (या शब्दों के समूह) पहले से ही यादृच्छिक रूप से बाएं और दाएं स्थानांतरित हो रहे हैं।

ऐसा लगता है कि यह गोल करने वाली त्रुटियों की संभावना है - एक प्रभावित ब्लॉक क्षैतिज विमान में एक पिक्सेल को स्थानांतरित करने के लिए दिखता है क्योंकि अक्षरों को रेखा के अंत में जोड़ा जाता है। अगर मैं StringFormat.GenericDefault (GD) का उपयोग करता हूं तो ऐसा नहीं होता है, लेकिन वर्णों को कम सटीक रूप से प्रस्तुत किया जाता है और यह स्वीकार्य नहीं है।

मैं तर्क था कि मैं धीरे धीरे जी.टी. में जी.डी. बदल सकता है (प्रत्येक के लिए सेटिंग्स MSDN में चर्चा कर रहे हैं और स्पष्ट रूप से डीबगर में जांच की जा सकती है) और जो FormatFlags या अन्य सेटिंग इस पैदा कर रहा था देख सकते हैं और वहां से चले जाते हैं। हालांकि, अगर मैं जीडी की प्रतिलिपि लेता हूं, तो सभी गुणों को बदलें, इसलिए यह जीटी के समान है, चरित्र प्लेसमेंट काफी अलग है - इन दो समान रूप से समान वस्तुओं का व्यवहार स्पष्ट रूप से समान नहीं है।

आईएमएचओ, नेट रिफ्लेक्टर बहुत सी चीजों की तरह दिखाता है कि स्ट्रिंगफॉर्मैट एक गैर-प्रबंधित ऑब्जेक्ट के लिए सिर्फ एक रैपर है और मैं केवल यह मान सकता हूं कि इसके सभी गुण .NET सॉफ़्टवेयर के संपर्क में नहीं आते हैं।

क्या कोई भी ऐसा कुछ सुझा सकता है जो मेरी मदद कर सकता है? मुझे पता है कि टेक्स्ट रेन्डरर प्रतिपादन के लिए एक वैकल्पिक विधि प्रदान कर सकता है लेकिन मैंने पहले अपनी डिजाइन प्रक्रिया में छूट दी थी (हालांकि मुझे वास्तव में याद नहीं आया कि समस्या अब क्या थी ...)।

संपादित

कोड मैं प्रतिपादन के लिए उपयोग कर रहा हूँ इस प्रकार है:

sForm = new StringFormat(StringFormat.GenericTypographic); 
sForm.FormatFlags |= StringFormatFlags.MeasureTrailingSpaces; 

using (SolidBrush brush = new SolidBrush(frmt.ForegroundColour)) 
    context.DrawString(line.Text, frmt.DisplayFont, brush, new PointF(horizontal, height), sForm); 
+0

आप प्रयोग करते हैं MeasureString()? उस कॉल के साथ एक स्निपेट दिखाएं। –

+1

मैं यहां MeasureString() का उपयोग नहीं करता - मैंने यह दिखाने के लिए जवाब संपादित किया है कि मैं क्या कर रहा हूं। –

उत्तर

0

ठीक है, मैं समस्या को हल कर दिया है। यह वही तरीका नहीं है जिसे मैं करना चाहता था, लेकिन संदर्भ के लिए, मैंने इसे इस तरह किया है:

मेरे पास पहले से ही कोड है जो प्रत्येक शब्द के लिए एक बाउंडिंग बॉक्स की गणना करता है (नियंत्रण में क्लिक करते समय देखभाल स्थिति को काम करने के लिए और उचित पाठ प्रदर्शित करने के लिए), इसलिए पूरी लाइन को एक बार में खींचने के बजाय, अब मैं प्रत्येक शब्द को अलग से खींच रहा हूं।

प्रत्येक शब्द के लिए DrawString() को लगातार कॉल करने के लिए अपर्याप्त लगता है (जब यह एक बार में पूरे बहु-रेखा ब्लॉक का सामना कर सकता है), लेकिन कार्यक्रम बहुत तेज़ रहता है।

अब अगर केवल मैं बाहर काम कर सकता था कारण है कि यह एक शब्द के रूप में शब्द बढ़ता भीतर अलग-अलग पत्र के लिए कर्निंग बदलना चाहते हैं लगता है ...