2009-05-28 7 views
19

Tenía que necesitar una etiqueta con una fuente grande en una forma Delphi y noté que sus curvas aún estaban algo irregulares. Lo comparé con el mismo tamaño y la fuente en MSWord que era mucho más suave. Después de investigar, encontré el código que me permitió suavizar mis fuentes, pero está desordenado y me preguntaba si había una mejor manera de hacerlo con . Buscando en la fuente VCL, TFont parece casado con NONANTIALIASED_QUALITY que es bastante frustrante ...Suavizado de fuente en Delphi

Gracias Bri

procedure TForm1.SetFontSmoothing(AFont: TFont); 
var 
    tagLOGFONT: TLogFont; 
begin 
    GetObject(
    AFont.Handle, 
    SizeOf(TLogFont), 
    @tagLOGFONT); 
    tagLOGFONT.lfQuality := ANTIALIASED_QUALITY; 
    AFont.Handle := CreateFontIndirect(tagLOGFONT); 
end; 

procedure TForm1.FormCreate(Sender: TObject); 
var 
    I : integer; 
begin 
    For I :=0 to ComponentCount-1 do 
    If Components[I] is TLabel then 
     SetFontSmoothing(TLabel(Components[I]).Font); 
end; 
+3

¿Funciona así este código (y solo quiere limpiarlo y encontrarlo de alguna manera fácil) o todavía no es lo suficientemente fluido o no funciona? – schnaader

+0

¿Qué parte de este código considera desordenado? –

+0

Parece un desperdicio que tengo que pinchar cada fuente en cada etiqueta cuando el VCL ya lo ha hecho. Busqué algo que pudiera anular o subclase pero sin suerte. Supongo que esta es la única forma de lograr lo que quiero. Bri –

Respuesta

29

Puede engañar a la VCL para que cree su propia clase que hereda de TLabel. Este es un código de prueba de concepto, probado con Delphi 4, que debería comenzar.

Crear una nueva unidad para su propia clase TLabel:

unit AntiAliasedLabel; 

interface 

uses 
    Windows, Messages, SysUtils, Controls, StdCtrls, Graphics; 

type 
    TLabel = class(StdCtrls.TLabel) 
    private 
    fFontChanged: boolean; 
    public 
    procedure Paint; override; 
    end; 

implementation 

procedure TLabel.Paint; 
var 
    LF: TLogFont; 
begin 
    if not fFontChanged then begin 
    Win32Check(GetObject(Font.Handle, SizeOf(TLogFont), @LF) <> 0); 
    LF.lfQuality := ANTIALIASED_QUALITY; 
    Font.Handle := CreateFontIndirect(LF); 
    fFontChanged := TRUE; 
    end; 
    inherited; 
end; 

end. 

Ahora modifique su unidad formulario que contiene la etiqueta, la adición de la unidad AntiAliasedLabel despuésStdCtrls. Esto da como resultado que se cree su propia clase AntiAliasedLabel.TLabel donde normalmente se crearía StdCtrls.TLabel.

+0

+1 solución muy interesante! – jpfollenius

+4

+1 Woah - No tenía idea de que pudieras salir con trucos como ese. ¡Gracias por abrir mis ojos! – robsoft

+0

Muy, muy, muy, muy, muy, muy, muy ... AGRADABLE! Gracias por este truco fácil. – Codebeat

3

La forma más fácil es crear su propio componente basado en TLabel, como TSmoothLabel o TAntiAliasedLabel y agrega tu código de suavizado. Luego usa su componente en lugar del estándar TLabel.

+0

Es cierto, pero estoy cargando un DFM existente que especifica la clase TLabel, por lo que su sugerencia podría funcionar si hay una forma de volver a registrar TLAbel. Bri –

+1

Hay una manera, pero requiere reemplazar la entrada TLabel.NewInstance VMT por un método propio en el tiempo de ejecución. El JCL (Biblioteca de códigos JEDI) tiene funciones para hacer esto. –

+3

@Brian: ¿Por qué no puedes simplemente arreglar los archivos DFM y PAS (desde fuera del IDE) para usar tu nueva clase? Alternativa: si está usando una versión de Delphi que los admite, puede usar un ayudante de clase para TLabel. (Especifique qué Delphi en el futuro). No recomiendo la ruta de clase de ayuda si hay alguna otra forma, sin embargo, porque afectará cualquier TLabel que esté dentro de su alcance. –

7

En mi humilde opinión, la VCL debe comprobar el suavizado de fuente predeterminado del sistema y aplicarlo como el predeterminado en tiempo de ejecución. De lo contrario, al menos debería adoptar un alisamiento más razonable. Se podría argumentar, en este caso, que ClearType sería un mejor valor predeterminado, considerando que> 50% de los monitores en estos días son LCD (y más del 50% de las máquinas ejecutan XP o mejor).

Esto es un truco reconocido (y como menciona Ken White, no es el mejor enfoque si hay alternativas), pero necesitaba una forma de solucionarlo globalmente para formularios que contienen literalmente cientos de tipos de componentes de terceros (herencia de componentes) poco realista).

me cambió la fuente predeterminada de la calidad en Graphics.pas, TFont.GetHandle de la siguiente manera:

// lfQuality: = DEFAULT_QUALITY;

lfCalidad: = 5; // (HACK) CLEARTYPE_QUALITY, las fuerzas cleartype

5

De:. http://objectmix.com/delphi/725245-tlabel-antialiasing-possibile-3.html

"el simple uso de una fuente que soporta el suavizado de fuentes debe fijar esta Delphi usos (o al menos se utiliza para usar) MS Sans Serif por defecto, que no admite el suavizado de soporte de (ClearType o de otro modo). Si configura su fuente en Tahoma (mejor para XP) o Segoe UI (mejor para Vista), obtendrá automáticamente suavizado de fuente según la configuración del sistema en su aplicación Delphi ".

Confirmado, funciona muy bien con Delphi XE y Win7.Ocupado cambiando todas mis fuentes en este momento ;-)

Cuestiones relacionadas