2013-02-25 6 views
8

Ho scritto una piccola applicazione che disegna testo su immagini in memoria e li scrive su file. Il codice di base Delphi è simile a:Come posso sovrascrivere l'impostazione ClearType quando disegno il testo utilizzando l'API Win32?

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; 

Purtroppo il testo elaborato è diverso a seconda dell'impostazione ClearType del computer che esegue l'applicazione. Mi piacerebbe avere un output coerente nella mia applicazione indipendentemente dall'impostazione ClearType locale (l'output non viene comunque visualizzato direttamente sullo schermo). C'è qualche opzione API Win32 per sovrascrivere le impostazioni ClearType locali?

risposta

12

La sfumatura dei caratteri del testo è determinata dal tipo di carattere selezionato nel dispositivo. Per informazioni sulle opzioni offerte dall'interfaccia di Win32 non elaborata, leggere la documentazione LOGFONT.

In Delphi l'API di carattere API Win32 sottostante è racchiusa nella classe TFont. La proprietà pertinente a questa domanda è Quality. Il valore predefinito è fqDefault che utilizza l'impostazione di arrotondamento dei font a livello di sistema. Si desidera impostare su fqAntialiased o fqNonAntialiased.

Le versioni precedenti di Delphi non hanno questa proprietà. In tal caso sarà necessario chiamare lo CreateFontIndirect per creare un HFONT con le impostazioni di qualità richieste. È possibile chiamare this function subito prima di iniziare a disegnare il testo:

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; 

Passo sia NONANTIALIASED_QUALITY o ANTIALIASED_QUALITY a seconda delle esigenze.

6

Credo che sia possibile creare un nuovo carattere logico che non utilizzi alcun ClearType. Assicurarsi di passare il flag NONANTIALIASED_QUALITY come parametro fdwQuality di CreateFont:

carattere non è mai antialias, cioè, la smussatura dei caratteri non è fatto.

+4

È inoltre possibile utilizzare la qualità anti-aliasing, che esegue il rendering con antialiasing vecchio stile, ovvero senza Cleartype. Questo ti dà un testo di qualità decente che apparirà migliore del testo disegnato senza alcun tipo di smussamento dei caratteri. –

Problemi correlati