2008-09-23 14 views
16

मैं सी ++ में जीडीआई + का उपयोग कर रहा हूं। (यह समस्या सी # में भी मौजूद हो सकती है)।MeasureString() बाईं ओर पाठ को पैड करता है और दाएं

मुझे लगता है कि जब भी मैं ग्राफिक्स :: MeasureString() या ग्राफिक्स :: DrawString() को कॉल करता हूं, तो स्ट्रिंग को बाएं और दाएं खाली स्थान के साथ गद्देदार किया जाता है।

उदाहरण के लिए, यदि मैं एक कूरियर फ़ॉन्ट का उपयोग कर रहा हूं, (इटैलिक नहीं!) और मैं "पी" को मापता हूं तो मुझे 9 0 मिलते हैं, लेकिन "पीपी" मुझे 150 देता है। मुझे उम्मीद है कि एक मोनोस्पेस फ़ॉन्ट चौड़ाई को दोगुना कर देगा "पीपी" के लिए।

मेरा प्रश्न है: क्या यह इरादा या दस्तावेज व्यवहार है, और मैं इसे कैसे अक्षम कर सकता हूं?

RectF Rect(0,0,32767,32767); 
RectF Bounds1, Bounds2; 
graphics->MeasureString(L"PP", 1, font, Rect, &Bounds1); 
graphics->MeasureString(L"PP", 2, font, Rect, &Bounds2); 
margin = Bounds1.Width * 2 - Bounds2.Width; 

उत्तर

11

यह डिजाइन द्वारा है, कि विधि वास्तविक ग्लिफ़ का उपयोग नहीं करता चौड़ाई को मापने के लिए और इतने overhangs के मामले में एक छोटे से गद्दी कहते हैं।

लेआउट में आसन्न तार (उदाहरण के लिए, जब स्वरूपित पाठ को लागू), MeasureCharacterRanges विधि या MeasureString से एक का उपयोग के लिए उपयुक्त मैट्रिक्स प्राप्त करने के लिए:

MSDN एक अलग विधि का उपयोग करता है, तो आप और अधिक सटीकता की जरूरत का सुझाव वे विधियां जो StringFormat लेती हैं, और GenericTypographic पास करती हैं। साथ ही, GraphicsAntiAlias के लिए TextRenderingHint सुनिश्चित करें।

6

यह सच है कि है डिजाइन द्वारा, हालांकि स्वीकार किए जाते हैं जवाब पर लिंक वास्तव में सही नहीं है। मुद्दा उन सभी विधियों में फ्लोट्स का उपयोग है जब आप वास्तव में उपयोग करना चाहते हैं पिक्सेल (इन्ट्स) है।

TextRenderer class इस उद्देश्य के लिए है और सही आकार के साथ काम करता है। इसका उपयोग करने की पैदल यात्रा के लिए यह link from msdn देखें।

+0

मुझे टेक्स्टरेंडर क्लास के साथ बेहतर परिणाम मिलते हैं। – Bitterblue

+0

टेक्स्ट रेन्डरर बिल्कुल वैसा ही था जो मुझे इसी तरह की स्थिति में चाहिए – Rob

+0

टेक्स्ट रेन्डरर ने भी मेरे लिए बहुत बेहतर काम किया – Migs

0

टेक्स्ट रेन्डरर फ़ॉन्ट का आकार प्राप्त करने के लिए बहुत अच्छा था। लेकिन ड्रॉइंग लूप में, TextRenderer.DrawText का उपयोग करके ग्राफिक्स की तुलना में बेहद धीमी गति से चल रहा था। ड्रॉस्ट्रिंग()।

एक स्ट्रिंग की चौड़ाई के बाद से समस्या, अपने TextRenderer.MeasureText और graphics.DrawString के संयोजन का उपयोग बंद काफी बेहतर ..

5

संलग्न StringFormat.GenericTypographic ठीक कर देंगे आपकी समस्या है:

graphics->MeasureString(L"PP", 1, font, width, StringFormat.GenericTypographic); 

लागू करें DrawString पर वही विशेषता।

+0

जेनेरिक टाइपोग्राफिक मेरे लिए आदर्श है, क्योंकि मैं वैसे भी नियंत्रण में अपना मार्जिन उपयोग कर रहा हूं। –

+0

लगभग सही लेकिन छोटे पैडिंग आवश्यक हैं। – Slappy

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