2010-04-08 9 views
6

पर अलग-अलग एरियल प्रस्तुत करता है मेरे पास एक सी # एप्लिकेशन है जो पाठ प्रतिपादन करता है, जो कि एक साधारण wysiwyg टेक्स्ट एडिटर के समान है।TextRenderer.DrawText XP बनाम Vista

मैं टेक्स्ट को पाठ प्रस्तुत करने के लिए TextRenderer.DrawText का उपयोग कर रहा हूं और पाठ को मापने के लिए GetTextExtentPoint32 का उपयोग कर रहा हूं ताकि मैं एक ही पंक्ति पर विभिन्न फ़ॉन्ट शैलियों/आकारों को स्थिति दे सकूं।

Vista में यह सब ठीक काम करता है। हालांकि एक्सपी में, एरियल अलग-अलग प्रस्तुत करता है, 'ओ' और 'बी' जैसे कुछ वर्ण विस्टा की तुलना में अधिक चौड़ाई लेते हैं। लगता है कि GetTextExtentPoint32 स्ट्रिंग को मापने जैसा प्रतीत होता है क्योंकि यह विस्टा में छोटी चौड़ाई के साथ होगा। अंत परिणाम यह है कि प्रत्येक अब और उसके बाद पाठ का एक भाग इसे पहले से टेक्स्ट को ओवरलैप कर देगा क्योंकि पिछले पाठ को स्क्रीन पर वास्तव में छोटे से मापा जाता है।

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

किसी के पास क्या हो रहा है इसके बारे में कोई विचार है?

संक्षेप में, TextRenderer.DrawText और GetTextExtentPoint32 एरियल के लिए xp में मेल नहीं खाते हैं। ड्राटाक्स्ट विस्टा में कुछ वर्णों को बड़ा और/या छोटा करता है लेकिन GetTextExtentPoint32 टेक्स्ट को मापने जैसा प्रतीत होता है क्योंकि यह Vista में होगा (जो कि xp और vista दोनों में टेक्स्ट प्रतिपादन से मेल खाता है)। उम्मीद है कि समझ में आता है।

नोट: दुर्भाग्यवश TextRenderer.MeasureString मेरी आवश्यकताओं को पूरा करने के लिए पर्याप्त तेज़ या सटीक नहीं है। मैंने इसका इस्तेमाल करने की कोशिश की और उसे बाहर निकालना पड़ा।

+0

+1 क्योंकि मुझे पता है कि आप किसके साथ काम कर रहे हैं! और मुझे केवल निश्चित चौड़ाई फोंट से निपटना पड़ा। – leppie

+0

क्या आप सुनिश्चित हैं कि यह डीपीआई या क्लेरटाइप प्रकार की समस्या नहीं है? –

उत्तर

0

मैं सी # लड़का नहीं हूं, लेकिन मेरा मानना ​​है कि .NET प्रतिपादन जीडीआई + के शीर्ष पर बनाया गया है। मुझे यह भी यकीन है कि जीडीआई + अपना स्वयं का फ़ॉन्ट प्रतिपादन करता है जो बिना स्केलिंग स्केलिंग का उपयोग करता है।

GetTextExtentPoint32, दूसरी तरफ, जीडीआई का हिस्सा है। जीडीआई आकार संकेतों का उपयोग करता है, जो फ़ॉन्ट आकार के आधार पर वर्णों की चौड़ाई को प्रभावित कर सकता है। छोटे आकार में सामान्य जीडीआई पाठ में थोड़ा सा गेटटर दिखाई देगा, लेकिन यह रैखिक रूप से स्केल नहीं करेगा।

आपको पिक्सेल-परिपूर्ण परिणाम प्राप्त करने के लिए लगातार एक मॉडल या दूसरे का उपयोग करना होगा।

ऐसे अन्य कारक हो सकते हैं जो Vista पर Vista पर अधिक स्पष्ट हो सकते हैं, लेकिन दोनों में मौलिक समस्या मौजूद है। इन अन्य कारकों में डीपीआई सेटिंग्स, डीपीआई स्केलिंग, क्लीयरटाइप या एंटीअलाइजिंग सेटिंग्स, फ़ॉन्ट-लिंकिंग (यदि आप अन्य अक्षरों से स्क्रिप्ट जोड़ रहे हैं), फ़ॉन्ट प्रतिस्थापन (विशेष रूप से प्रिंटिंग में), और संभवतः एरियल के विभिन्न संस्करण भी शामिल हो सकते हैं। मुझे यह भी यकीन नहीं है कि जीडीआई + जीडीआई के समान डिफॉल्ट मैपिंग मोड का उपयोग करता है।

यह भी देखें my answer on print preview

2

एड्रियन का जवाब देने के लिए समय निकालने के लिए धन्यवाद।

मेरी समझ यह है कि TextRenderer.DrawText वास्तव में जीडीआई + टेक्स्ट प्रतिपादन को छोड़कर जीडीआई को एक कॉल लपेटता है। यही कारण है कि मैं आउटपुट के साथ jiving नहीं GetTextExtentPoint32 के बारे में उलझन में था।

मुझे लगता है कि मुझे यह समस्या मिली है। यह पता चला है कि क्या आपने ग्राफिक्स को सेट किया है .extRenderingHint System.Drawing.Text.TextRenderingHint.ClearTypeGridFit, या संभवतः अन्य मान, यह कुछ फ़ॉन्ट्स में कुछ वर्णों को आकार में बढ़ाने या घटाने का कारण बनता है। यह Vista में Vista की तुलना में अधिक सत्य प्रतीत होता है। मैंने Vista में यह बिल्कुल नहीं देखा है।वैसे भी, ऐसा लगता है कि GetTextExtentPoint32 या तो अंतर को पहचानने में सक्षम नहीं है या जब मैं कॉल करता हूं तो मैं किसी प्रकार का ध्वज सेट नहीं कर रहा हूं।

मेरा समाधान केवल सिस्टम डिफ़ॉल्ट textrenderinghint सेटिंग्स का उपयोग करना है।

+0

सही दिखता है। मुझे यहां कुछ अच्छी जानकारी मिली है (लेकिन वह कुछ संदिग्ध दावों को भी बनाता है, इसलिए देखें)। http://blogs.msdn.com/cjacks/archive/2006/05/11/595525.aspx –

0

वास्तव में DrawTextEx पर आधारित टेक्स्ट रेन्डरर का ड्रॉटेक्स्ट और मेजरस्ट्रिंग दोनों (और यह उपयोगकर्ता 32 है, जीडीआई फ़ंक्शन नहीं)। तो आप MeauseString के बजाय इस फ़ंक्शन में देशी मार्शल कॉल का उपयोग करने पर विचार कर सकते हैं, क्योंकि यह कुछ अतिरिक्त गणना कर रहा है (विशेष रूप से यदि आप एचडीसी के बिना फ़ंक्शन ओवरराइड का उपयोग कर रहे हैं)।

शायद यह post भी आपके लिए सहायक होगा।