2013-02-25 54 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設置如何(輸出不會直接顯示到屏幕上)。是否有一些Win32 API選項可以覆蓋本地ClearType設置?

回答

12

文本的字體平滑由您選擇到設備中的字體決定。要了解原始Win32接口提供的選項,請閱讀LOGFONT文檔。

在Delphi中,底層的Win32 API字體API被TFont類包裝起來。與此問題相關的財產是Quality。默認值爲fqDefault,它使用系統級字體平滑設置。您要將Quality設置爲fqAntialiasedfqNonAntialiased

老版本的Delphi沒有這個屬性。在這種情況下,您需要致電CreateFontIndirect以創建具有所需質量設置的HFONT。您可以立即撥打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_QUALITYANTIALIASED_QUALITY

6

我相信你可以創建一個新的邏輯字體,不使用任何ClearType。確保通過NONANTIALIASED_QUALITY標誌爲CreateFontfdwQuality參數:

字體是從來沒有抗鋸齒,也就是說,字體平滑沒有這樣做。

+4

您還可以使用抗鋸齒質量,該抗鋸齒質量可以使用舊式抗鋸齒進行渲染 - 即不使用Cleartype。這給你體面的質量文本,看起來比沒有任何字體平滑繪製的文本更好。 – 2013-02-25 16:25:04