2013-02-25 14 views
8

Ich habe eine kleine Anwendung geschrieben, die Text auf In-Memory-Bildern zeichnet und sie in Dateien schreibt. Der grundlegende Delphi-Code ähnelt:Wie kann ich die ClearType-Einstellung beim Zeichnen von Text mithilfe der Win32-API überschreiben?

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; 

Leider ist der gezeichnete Text unterscheidet je nach Einstellung Cleartype des Computers der Anwendung ausgeführt wird. Ich möchte eine konsistente Ausgabe in meiner Anwendung haben, unabhängig von der lokalen ClearType-Einstellung (die Ausgabe wird sowieso nicht direkt angezeigt). Gibt es eine Win32-API-Option, um die lokalen ClearType-Einstellungen zu überschreiben?

Antwort

12

Die Schriftglättung von Text wird durch die Schriftart bestimmt, die Sie in das Gerät auswählen. Weitere Informationen zu den Optionen, die von der Win32-Raw-Schnittstelle angeboten werden, finden Sie in der Dokumentation LOGFONT.

In Delphi ist die zugrunde liegende Win32-API-Schriftart-API von der Klasse TFont umschlossen. Die Eigenschaft, die zu dieser Frage gehört, ist Quality. Der Standardwert ist fqDefault, der die systemweite Schriftglättungseinstellung verwendet. Sie möchten Quality auf fqAntialiased oder fqNonAntialiased setzen.

Ältere Versionen von Delphi haben diese Eigenschaft nicht. In diesem Fall müssen Sie CreateFontIndirect anrufen, um eine HFONT mit den erforderlichen Qualitätseinstellungen zu erstellen. Sie können this function sofort anrufen, bevor Sie mit dem Zeichnen Text beginnen:

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; 

Pass entweder NONANTIALIASED_QUALITY oder ANTIALIASED_QUALITY je nach Ihren Bedürfnissen.

6

Ich glaube, dass Sie eine neue logische Schriftart erstellen können, die keinen ClearType verwendet. Achten Sie auf die NONANTIALIASED_QUALITY Flagge als fdwQuality Parameter von CreateFont weitergeben müssen:

Font ist nie Anti-Aliasing, das heißt, die Schriftglättung nicht getan.

+4

Sie können auch Anti-Aliased-Qualität verwenden, die mit Antialiasing im alten Stil rendert - also ohne Cleartype. Das gibt Ihnen einen anständigen Qualitätstext, der besser aussieht als ein Text, der überhaupt nicht gezeichnet wird. –