Suavizado de fuentes en Delphi
fonts true-type-fonts (4)
De: http://objectmix.com/delphi/725245-tlabel-antialiasing-possibile-3.html
"simplemente usar una fuente que admita el suavizado de fuentes debería solucionar este problema. Delphi usa (o al menos se usa para usar) MS Sans Serif como predeterminado, que no admite el suavizado (ClearType u otro). Si configura su fuente en Tahoma (mejor para XP) o Segoe UI (mejor para Vista), obtendrá automáticamente el suavizado de fuentes de acuerdo con la configuración del sistema en su aplicación Delphi ".
Confirmado, funciona maravillosamente con Delphi XE y Win7. Ocupado cambiando todas mis fuentes ahora mismo ;-)
Tenía motivos para necesitar una etiqueta con una fuente grande en una forma Delphi y noté que sus curvas aún estaban ligeramente dentadas. Comparé esto con el mismo tamaño y fuente en MSWord que era mucho más suave. Después de la investigación, encontré un código que me permitió suavizar mis fuentes pero está desordenado y me preguntaba si habría una mejor manera. Buscando en la fuente de VCL, TFont parece casado con NONANTIALIASED_QUALITY que es bastante frustrante ...
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;
En mi humilde opinión, el VCL debería verificar el suavizado de fuente predeterminado del sistema y aplicarlo como predeterminado en tiempo de ejecución. Si no es así, al menos debería tener un ajuste más razonable. Se podría argumentar, en este caso, que ClearType sería un valor predeterminado mejor, 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).
Este es un truco reconocido (y como Ken White menciona, no es el mejor enfoque si hay alternativas), pero necesitaba una forma de solucionar esto globalmente para los formularios que contienen literalmente cientos de tipos de componentes de terceros (lo que hace que la herencia de componentes sea poco realista).
Cambié la calidad de fuente predeterminada en Graphics.pas, TFont.GetHandle de la siguiente manera:
// lfQuality: = DEFAULT_QUALITY;
lfQuality: = 5; // (HACK) CLEARTYPE_QUALITY, fuerza cleartype
La forma más sencilla es crear su propio componente basado en TLabel, como TSmoothLabel o TAntiAliasedLabel, y agregarle su código de suavizado. Luego usas tu componente en lugar del TLabel estándar.
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 ayudarlo a comenzar.
Crea una nueva unidad para tu 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 la unidad de formulario que contiene la etiqueta, agregando la unidad StdCtrls
después de StdCtrls
. Esto da lugar a que se AntiAliasedLabel.TLabel
su propia clase AntiAliasedLabel.TLabel
donde normalmente se StdCtrls.TLabel
.