2011-08-22 14 views
13

Windows में, CreateFontIndirect() कॉल चुपचाप संगत फोंट स्थानापन्न कर सकते हैं यदि अनुरोध फॉन्ट का अनुरोध नहीं है। GetObject() कॉल इस प्रतिस्थापन को प्रतिबिंबित नहीं करता है; यह एक ही LOGFONT में पारित देता है। मैं क्या फॉन्ट था वास्तव में बनाया कैसे मिल सकती है? वैकल्पिक रूप से, मैं विंडोज़ को केवल सटीक फ़ॉन्ट को वापस लौटने के लिए कैसे मजबूर कर सकता हूं?मुझे कैसे पता चलेगा कि मेरे CreateFont कॉल के लिए वास्तव में किस फ़ॉन्ट का उपयोग किया गया था?

+0

आपको इस तरह के नियंत्रण के लिए यूनिस्क्रिप एपीआई का उपयोग करने की आवश्यकता है। –

+1

@ हंस, दुर्भाग्य से यह कुछ काफी बालों वाली विरासत कोड के बीच में गहरा है। Uniscribe का उपयोग करने के लिए इसे refactoring एक होगा ...कठिन कार्य, कम से कम परीक्षण और दस्तावेज़ीकरण की कमी से मदद नहीं की। अगर एचएफओटी से इस प्रकार की जानकारी प्राप्त करने के लिए अनियंत्रित जीडीआई कॉल का कुछ बच्चा है, तो यह कुछ भी बेहतर नहीं होगा :) – bdonlan

उत्तर

15

विंडोज़ में, CreateFontIndirect() कॉल चुपचाप संगत फोंट को प्रतिस्थापित कर सकती है अगर अनुरोधित फ़ॉन्ट का अनुरोध नहीं किया जाता है। GetObject() कॉल इस प्रतिस्थापन को प्रतिबिंबित नहीं करता है; यह उसी LOGFONT को पास करता है।

यह CreateFontIndirect नहीं है जो प्रतिस्थापन कर रहा है। प्रतिस्थापन तब होता है जब फ़ॉन्ट डीसी में चुना जाता है। CreateFontIndirect बस आपको LOGFONT की एक आंतरिक प्रतिलिपि के लिए एक हैंडल देता है। यही कारण है कि GetObject आपको वही LOGFONT वापस देता है।

मैं कैसे देख सकता हूं कि वास्तव में बनाया गया था?

यदि आप लक्षित डीसी में एचएफओटी का चयन करते हैं, तो आप डीसी से उस फ़ॉन्ट के बारे में जानकारी के लिए पूछ सकते हैं जिसे वास्तव में LOGFONT के सर्वोत्तम मैच के रूप में चुना गया था।

  • चेहरा नाम GetTextFace के साथ उपलब्ध है।
  • आप GetTextMetrics साथ मैट्रिक्स मिल सकती है।
  • चयनित फ़ॉन्ट ट्रू टाइप या ओपन टाइप है, तो आप GetOutlineTextMetrics साथ अतिरिक्त मीट्रिक मिल सकती है।

कि अनिवार्य रूप से बताता है कि फॉन्ट वास्तव में बनाया गया था।

एक तरफ

:

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

+1

यह ध्यान देने योग्य है कि 'GetTextFace' आवश्यक रूप से उसी नाम को वापस नहीं करता है, भले ही चयनित फ़ॉन्ट का अनुरोध किया गया हो। उदाहरण के लिए, यदि आप 'एमएस गोथिक' को 'CreateFont'' पर पास करते हैं, तो 'GetTextFace'' एमएस ゴ シ ッ ク 'या 'एमएस गोथिक' वापस लौटा सकता है लोकेल सेटिंग्स पर निर्भर करता है। – raymai97

1

ओएस के विभिन्न भाषा संस्करणों पर उपयुक्त फ़ॉन्ट पाने के लिए, LOGFONT संरचना में वांछित फ़ॉन्ट विशेषताओं के साथ कॉल EnumFontFamiliesEx, तो उपयुक्त टाइपफेस नाम निकालते हैं और CreateFont या CreateFontIndirect का उपयोग कर फ़ॉन्ट बनाने।

हालांकि यह एचएफओटी से वास्तविक फ़ॉन्ट नाम प्राप्त करने का सार्वभौमिक तरीका नहीं है, तो आप पहले से जांच सकते हैं कि CreateFontIndirect (सबसे अधिक संभावना) वापसी क्या करेगा।

से कैसे MSDN गुण यह तरीका विंडोज आंतरिक रूप से प्रतिस्थापन करता है की तरह लगता है से एक फ़ॉन्ट परिवार प्राप्त करने के लिए एक अच्छा समाधान के रूप में इस सुझाव है आंकना।

+0

मुझे संदेह है कि प्रश्न वास्तव में फ़ॉन्ट आउटपुट के बारे में है, लक्ष्य लक्ष्य डिवाइस पर उपलब्ध फ़ॉन्ट्स के चयन के बजाय विभिन्न भाषा/स्क्रिप्ट मुद्दों के लिए फ़ॉन्ट-लिंकिंग या फ़ॉन्ट-फ़ॉलबैक। –

+0

@ एड्रियन मैकार्थी, मुझे लगता है कि टिप्पणी का पहला भाग भ्रामक है। महत्वपूर्ण हिस्सा यह है कि EnumFontFamiliesEx का उपयोग उन फ़ॉन्ट्स को करने के लिए किया जा सकता है जो LOGFONT में दिए गए मानदंडों से मेल खाते हैं। किसी भी अन्य सदस्य की तरह lfCharSet पर लागू होता है। – pezcode

+0

EnumFontFamiliesEx केवल LOGFONT के कुछ क्षेत्रों में दिखता है। वास्तविक फ़ॉन्ट मैपर सबकुछ देखता है। यह सुनिश्चित करने का एकमात्र तरीका यह तय करने का एकमात्र तरीका है कि कौन सा फ़ॉन्ट चुना जाता है, इसे डीसी में चुनना है और वे इसे पूछते हैं। –

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

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