2013-02-25 12 views
8

Napisałem małą aplikację, która rysuje tekst na zdjęciach w pamięci i zapisuje je w plikach. Podstawowy kod Delphi wygląda podobnie do:Jak mogę przesłonić ustawienie ClearType podczas rysowania tekstu przy użyciu interfejsu Win32 API?

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; 

Niestety rysowane tekst różni się w zależności od ustawienia ClearType komputera z uruchomioną aplikacją. Chciałbym mieć spójne dane wyjściowe w mojej aplikacji, niezależnie od lokalnego ustawienia ClearType (dane wyjściowe nie są wyświetlane bezpośrednio na ekranie). Czy istnieje opcja Win32 API, która zastępuje lokalne ustawienia ClearType?

Odpowiedz

12

Wygładzanie czcionki tekstu jest określane przez czcionkę wybraną do urządzenia. Aby dowiedzieć się więcej o opcjach oferowanych przez surowy interfejs Win32, przeczytaj dokumentację LOGFONT.

W Delphi podstawowy interfejs API czcionki API Win32 jest zawijany przez klasę TFont. Właściwość, która jest istotna dla tego pytania, to Quality. Domyślna wartość to fqDefault, która używa ustawienia wygładzania całego systemu. Chcesz ustawić Quality na fqAntialiased lub fqNonAntialiased.

Starsze wersje Delphi nie mają tej właściwości. W takim przypadku musisz zadzwonić pod numer CreateFontIndirect, aby utworzyć HFONT z wymaganymi ustawieniami jakości. Można zadzwonić this function bezpośrednio przed rozpoczęciem rysowania tekst:

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; 

przepustkę albo NONANTIALIASED_QUALITY lub ANTIALIASED_QUALITY w zależności od potrzeb.

6

Uważam, że można utworzyć nową czcionkę logiczną, która nie będzie używać żadnego ClearType. Upewnij się, aby przejść flagę NONANTIALIASED_QUALITY jako parametr CreateFontfdwQuality:

czcionki nie jest antyaliasing, czyli wygładzanie czcionek nie jest wykonywana.

+4

Można również użyć wygładzonej jakości, która renderuje się z antyaliasingiem w starym stylu - tzn. Bez typu Cleartype. Daje to przyzwoitą jakość tekstu, który będzie wyglądał lepiej niż tekst narysowany bez wygładzania czcionek. –