2013-02-25 67 views
8

मैंने एक छोटा सा एप्लीकेशन लिखा है जो इन-मेमोरी छवियों पर टेक्स्ट खींचता है और उन्हें फाइलों में लिखता है। बुनियादी डेल्फी कोड के समान दिखता है:Win32 API का उपयोग कर पाठ खींचते समय मैं ClearType सेटिंग को ओवरराइड कैसे कर सकता हूं?

var 
    Canvas : tCanvas; 
    Text : WideString; 
    TextRect : tRect; 
begin 
    Canvas := Bitmap.Canvas; 
    Canvas.Brush.Color := clBlack; 
    Canvas.Pen.Color := clBlack; 
    Canvas.Font.Name := 'Courier New'; 
    Canvas.Font.Size := 11; 
    Canvas.Font.Color := clWhite; 

    TextRect := ...; // calculate text position 
    DrawTextW(Canvas.Handle, PWideChar(Text), Length(Text), TextRect, DT_NOCLIP or DT_NOPREFIX or DT_SINGLELINE or DT_CENTER or DT_VCENTER); 
end; 

दुर्भाग्य से तैयार पाठ आवेदन चलाने वाले कंप्यूटर की ClearType सेटिंग के आधार पर अलग है। स्थानीय ClearType सेटिंग के बावजूद मैं अपने आवेदन में लगातार आउटपुट रखना चाहता हूं (आउटपुट को स्क्रीन पर सीधे प्रदर्शित नहीं किया जाता है)। स्थानीय ClearType सेटिंग्स को ओवरराइड करने के लिए कुछ Win32 API विकल्प है?

उत्तर

12

पाठ का फ़ॉन्ट चिकनाई आपके द्वारा चुने गए फ़ॉन्ट द्वारा निर्धारित फ़ॉन्ट द्वारा निर्धारित किया जाता है। कच्चे Win32 इंटरफ़ेस द्वारा प्रदान किए गए विकल्पों के बारे में जानने के लिए, LOGFONT दस्तावेज़ पढ़ें।

डेल्फी में अंतर्निहित Win32 API फ़ॉन्ट एपीआई TFont कक्षा द्वारा लिपटा हुआ है। इस प्रश्न से संबंधित संपत्ति Quality है। डिफ़ॉल्ट मान fqDefault है जो सिस्टम-व्यापी फ़ॉन्ट चिकनाई सेटिंग का उपयोग करता है। आप Quality को fqAntialiased या fqNonAntialiased पर सेट करना चाहते हैं।

डेल्फी के पुराने संस्करणों में यह संपत्ति नहीं है। आवश्यक स्थिति के साथ HFONT बनाने के लिए आपको CreateFontIndirect पर कॉल करने की आवश्यकता होगी। आप this function तुरंत फोन से पहले आप ड्राइंग पाठ शुरू कर सकते हैं:

procedure SetFontQuality(Font: TFont; Quality: Byte); 
var 
    LogFont: TLogFont; 
begin 
    if GetObject(Font.Handle, SizeOf(TLogFont), @LogFont) = 0 then 
    RaiseLastOSError; 
    LogFont.lfQuality := Quality; 
    Font.Handle := CreateFontIndirect(LogFont); 
end; 

पास या तो NONANTIALIASED_QUALITY या ANTIALIASED_QUALITY अपनी आवश्यकताओं पर निर्भर करता है।

6

मुझे विश्वास है कि आप एक नया लॉजिकल फ़ॉन्ट बना सकते हैं जो किसी भी ClearType का उपयोग नहीं करता है। CreateFont की fdwQuality पैरामीटर के रूप में NONANTIALIASED_QUALITY ध्वज पारित करने के लिए सुनिश्चित करें:

फ़ॉन्ट कभी नहीं antialiased है, वह है, फ़ॉन्ट समरेखण नहीं किया जाता है।

+4

आप एंटी-एलाइज्ड गुणवत्ता का भी उपयोग कर सकते हैं, जो पुराने स्टाइल एंटीअलाइजिंग के साथ प्रस्तुत करता है - यानी क्लीयरटाइप के बिना। यह आपको सभ्य गुणवत्ता वाला टेक्स्ट देता है जो किसी भी फ़ॉन्ट को चिकनाई के साथ खींचे गए पाठ से बेहतर दिखाई देगा। –