Сглаживание шрифтов в Delphi

мне понадобилась метка с большим шрифтом в форме Delphi и я заметил, что его изгибы все еще были слегка неровными. Я сравнил это с тем же размером и шрифт в MSWord, который был намного более плавным. После исследования я нашел код это позволило мне сгладить шрифты, но это грязно, и мне было интересно, если был ли лучший способ? Глядя в источник VCL, TFont, похоже, женат на NONANTIALIASED_QUALITY, что довольно расстраивает...

Спасибо 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;

4 ответов


вы можете обмануть VCL в создании собственного класса, который наследуется от TLabel. это код доказательства концепции, протестированный с Delphi 4,который должен заставить вас начать.

создать новый блок для вашего собственного 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.

теперь измените блок формы, содержащий метку, добавив AntiAliasedLabel блок после StdCtrls. Это приводит к вашему собственному классу AntiAliasedLabel.TLabel создается там, где обычно StdCtrls.TLabel будет создан.


IMHO, VCL должен проверять сглаживание шрифта по умолчанию и применять его как значение по умолчанию во время выполнения. Если нет, по крайней мере, он должен по умолчанию использовать более разумное сглаживание. В этом случае можно утверждать, что ClearType будет лучшим по умолчанию, учитывая, что > 50% мониторов в наши дни являются ЖК-дисплеями (и более 50% компьютеров работают под управлением XP или лучше).

это признанный Хак (и, как упоминает Кен Уайт, не лучший подход, если есть альтернативы), но мне нужен был способ исправить это глобально для форм, содержащих буквально сотни сторонних типов компонентов (что делает наследование компонентов нереалистичным).

Я изменил качество шрифта по умолчанию в графике.pas, TFont.GetHandle следующим образом:

/ / lfQuality: = DEFAULT_QUALITY;

lfQuality := 5; // (HACK) CLEARTYPE_QUALITY, силы cleartype


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

"просто, используя шрифт, который поддерживает сглаживание шрифтов, следует исправить. Дельфи использует (или, по крайней мере, используется для использования) MS без засечек по умолчанию, что не поддержка сглаживания (ClearType или иначе). если установить шрифт Тахома (лучший для XP) или Segoe UI (лучший для Vista), вы будете автоматически получить сглаживание шрифтов в соответствии с настройками системы в вашем Дельфи приложение."

подтверждено, он прекрасно работает с использованием Delphi XE и Win7. Занят изменением всех моих шрифтов прямо сейчас ; -)


самый простой способ-создать свой собственный компонент на основе TLabel, например TSmoothLabel или TAntiAliasedLabel, и добавить в него код сглаживания. Затем вы используете свой компонент вместо стандартного TLabel.