मेरे उद्देश्य: मैं एक IDWriteTextFormat के फ़ॉन्ट तो मैं गणना कर सकते हैं कि कैसे पाठ की कई लाइनों एक निश्चित ऊंचाई के IDWriteTextLayout में फिट कर सकते हैं की ऊंचाई प्राप्त करना चाहते हैं।DirectWrite: हो रही है एक फ़ॉन्ट की ऊंचाई
मेरे समस्या: सही अब मैं लाइनों के दृश्य संख्या की गणना करने के लिए इस कोड का उपयोग कर रहा:
inline int kmTextCtrl::GetVisLines() const
{
/* pTextFormat is an IDWriteTextFormat pointer, dpi_y is the desktop's vertical dpi,
and GetHeight() returns the height (in pixels) of the render target. */
float size = (pTextFormat->GetFontSize()/72.0f)*dpi_y;
return (int)(GetHeight()/size);
}
गणना कुछ फोंट के लिए सही प्रतीत हो रहा है, लेकिन ट्रू टाइप से किसी के लिए नहीं फोंट (उदाहरण: कूरियर न्यू, एरियल, टाइम्स न्यू रोमन)। इन फ़ॉन्ट्स के लिए, दिखाया गया पाठ रेंडर लक्ष्य की निचली लंबवत सीमा से बहुत छोटा है।
कुछ संदर्भ: मैं एक पाठ वापस स्क्रॉल बफर नियंत्रण जो नियंत्रण के लक्ष्य रेंडर करने के लिए पाठ डाल करने के लिए एक IDWriteTextLayout का उपयोग करता है बनाने रहा हूँ। मैं लेआउट में खींचने के लिए गोलाकार बफर (जो लाइन द्वारा std :: तारों में पाठ संग्रहीत करता है) से टेक्स्ट की कितनी पंक्तियां निर्धारित करने के लिए GetVisLines() के परिणाम का उपयोग करता है, और जब भी खिड़की स्क्रॉल या आकार बदलती है, इसे फिर से बनाएं।
यह "मूल" Win32 API C++ का उपयोग करके किया जा रहा है।
यह निश्चित रूप से एक गलत दृष्टिकोण है। उचित समाधान के लिए ड्वेन की प्रतिक्रिया देखें। – bunglehead
@ बंगलहेड यह गलत क्यों है? –
@DmitriNesteruk, क्योंकि यह बहुत अधिक धारणा करता है। उदाहरण के लिए आप इस बात पर विचार किए बिना लाइनों को मापना शुरू करते हैं कि वास्तविक टेक्स्ट डेटा के आधार पर अलग-अलग फ़ॉन्ट का उपयोग किया जा सकता है। इसके बाद यह लाइन स्पेसिंग मोड को अनदेखा करता है, और मान लेता है कि जिस तरह से लेआउट की गणना स्पेसिंग की गणना करती है (चढ़ाई + वंश + लाइनगैप)। ऊपर दिए गए शीर्ष रेटेड उत्तर को देखें, यह बेहतर बताता है कि यह अविश्वसनीय समाधान क्यों है। – bunglehead